r - 使用简单线性回归的结果创建数据框

标签 r

我有个人 body 状况指数的时间序列。我想为每个人确定 body 状况指数随时间的演变。换句话说,我想为每个人创建一个线性回归,然后将所有结果(截距和斜率)收集到一个如下所示的数据框中:

第一列:个人id

第二列:拦截

第三列:坡度

这是我尝试过的(只有我的数据集的样本),但我只得到所有结果的列表,我不知道如何将它们重新组合成一个数据框:

individual <- c(1,1,6,8,8,9,9,9,12,12)
day <- c(4,17,12,12,17,3,9,22,13,20)
condition <- c(0.72, 0.72, 0.67, 0.73, 0.76, 0.65, 0.68, 0.78, 0.73, 0.71)       
test <- data.frame(individual, day, condition)
ind.id <- unique(test$individual)
ind.list <- lapply(1:length(ind.id), function(i){ subset(test, test$individual==ind.id[i])})
lms <- lapply(ind.list, lm, formula=condition~day)

谢谢!

最佳答案

我会使用 plyr 包,它对您有一些好处:

  1. 函数 ddply() 将按个人或您指定的任何其他分组变量估计 lm()
  2. 默认返回一个data.frame

代码:

library(plyr)
ddply(test, "individual", function(x) {
  model <- lm(condition ~ day, data = x)
  coef(model)
})

返回:

  individual (Intercept)           day
1          1   0.7200000  1.207763e-17
2          6   0.6700000            NA
3          8   0.6580000  6.000000e-03
4          9   0.6242403  6.978799e-03
5         12   0.7671429 -2.857143e-03

如果您不想使用 plyr,或者只是想知道如何使用 base R 执行此操作,这里有一种方法。请注意,默认情况下,您的列表对象 lms 没有任何关联的名称,因此您需要确保 ind.id 与正确的系数匹配。我自己可能会使用 plyr 方法。

> cbind(ind.id, do.call("rbind",lapply(lms, coef)))
   ind.id (Intercept)           day
1       1   0.7200000  1.207763e-17
6       6   0.6700000            NA
8       8   0.6580000  6.000000e-03
9       9   0.6242403  6.978799e-03
12     12   0.7671429 -2.857143e-03

关于r - 使用简单线性回归的结果创建数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385882/

相关文章:

r - 使用 httr 为 Trello 创建 oauth token 时如何修复 "invalid return_url"错误?

R Shiny : display text as code on several lines

r - 如何在不同的数据框中找到共同的变量?

r - `is()` 和 `is...()` 函数的区别

r - 如何使用多个(或重复的)文本数据对 r 中的表进行透视?

R - 链接 data.table 操作的最佳实践

r - r中的决策树

r - `[.` `ReferenceClass` 方法

r - 使用 dcast.data.table 仅针对列值的子集从长转换为宽

visual-studio - 在 Visual Studio 安装项目中安装 100 个文件的最简单方法是什么