我有个人身体状况指数的时间系列。我想为每个人确定身体状况指数随时间的演变。换句话说,我想为每个人创建一个线性回归,然后将所有结果(截距和斜率)收集到一个如下所示的数据框中:
第一栏:个人身份
第二栏:拦截
Thirs column:Slope
这是我尝试的(只有我的数据集的一个样本),但我只得到所有结果的列表,我不知道如何将它们重新组合成一个数据帧:
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)
谢谢!
答案 0 :(得分:3)
我会使用包plyr
,这对您有好处:
ddply()
将按个人或您指定的任何其他分组变量估算lm()代码:
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
答案 1 :(得分:2)
对于这些情况,我喜欢plyr
:
ldply(lms, function(x) x$coefficients)
(Intercept) day
1 0.7200000 1.207763e-17
2 0.6700000 NA
3 0.6580000 6.000000e-03
4 0.6242403 6.978799e-03
5 0.7671429 -2.857143e-03
答案 2 :(得分:2)
查看lmList
包中的nlme
。更一般地说,您可能希望适合单个混合模型(nlme
或lme4
)而不是每个主题的单个模型。