【问题标题】:How can I pull slope and intercept variables produced by the segmented package and put into a dataframe using r?如何拉出分段包产生的斜率和截距变量并使用 r 放入数据框中?
【发布时间】:2018-01-23 18:40:42
【问题描述】:

谁能告诉我如何将分段包产生的斜率和截距取出并放入数据框中?这最终将用于将斜率和截距排列回其原始值。请参阅下面的数据(我从另一篇文章中获取)。

#加载包 图书馆(分段) 图书馆(tidyverse)

#set seed and develop data
set.seed(1)
Y<-c(13,21,12,11,16,9,7,5,8,8)
X<-c(74,81,80,79,89,96,69,88,53,72)
age<-c(50.45194,54.89382,46.52569,44.84934,53.25541,60.16029,50.33870,
   51.44643,38.20279,59.76469)
dat=data.frame(Y=Y,off.set.term=log(X),age=age)

#run initial GLM
glm.fit=glm(Y~age+off.set.term,data=dat,family=poisson)
summary(glm.fit)

#run segmented glm
glm.fitted.segmented <- segmented(glm.fit, seg.Z=~age + off.set.term, psi = 
list(age = c(50,53), off.set.term = c(4.369448)))

#Get summary, slopes and intercepts
summary(glm.fitted.segmented)
slope(glm.fitted.segmented)
intercept(glm.fitted.segmented)

【问题讨论】:

  • 您正在使用哪些tidyverse 功能,您认为我们需要library(tidyverse) 来实现?我没有看到。
  • 你能举一个你想要的输出的例子吗?
  • 嗨@Gregor。我不知道我是否需要tidyverse。我通常在 r 工作时使用它。我出于习惯加载它。
  • 你好@troh。我正在寻找:变量、斜率、截距。所以很明显变量会重复,并且根据模型中有多少断点会有一些空值。
  • 您的问题应该尽可能少。你没有在你的问题中使用tidyverse,所以library(tidyverse) 只是混乱。您可能会得到包含和不包含 tidyverse 包的答案。

标签: r piecewise


【解决方案1】:
library(broom)
library(dplyr)
library(tidyr)
library(stringr)

slopes <-
  bind_rows(lapply(slope(glm.fitted.segmented), tidy), .id = "variable") %>%
  mutate(type = str_extract(.rownames, "^[a-z]+"),
         model = str_extract(.rownames, "[0-9]+$")) %>%
  select(variable, model, type, estimate = "Est.")
intercepts <-
  bind_rows(lapply(intercept(glm.fitted.segmented), tidy), .id = "variable") %>%
  mutate(type = str_extract(.rownames, "^[a-z]+"),
         model = str_extract(.rownames, "[0-9]+$")) %>%
  select(variable, model, type, estimate = "Est.")

bind_rows(slopes, intercepts) %>%
  spread(type, estimate)

使用tidy 函数,您可以轻松提取每个变量的data.frame,然后提取模型和单元类型。将它们绑定在一起,并将类型和估计值传播到以变量、模型、截距和斜率结尾。

【讨论】:

  • 嗨@troh。这太棒了!谢谢你,谢谢你这么好心!
  • @Jordan 很乐意为您提供帮助。如果答案对您有用,请点赞并接受
  • 你好@troh。在分段模型中,有一个参数来设置 psi,它是拟合中的节点。有没有办法在上面的答案中也能把它们拉出来。我在 mutate 命令中尝试了 psi = str_extract(psi, "[0-9]+$") 但这不起作用。如果您需要我将此作为单独的问题发布,我也可以这样做。
  • 删除$。该符号告诉正则表达式确保数字位于字符串的末尾。当您删除它时,它会查找任何数字。
  • 谢谢@troh。我想我可能需要做点别的事情。 PSI 不是“斜率”函数输出的一部分。该命令看起来只是从该输出中获取内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2014-02-15
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
相关资源
最近更新 更多