我有一系列的个人身体状况指数。我想要为每个人确定身体状况指数随时间的演变。换句话说,我想为每个人创建一个线性回归,然后将所有结果(截取和斜率)收集到一个数据帧中,如下所示:
第一列:个人id
第二列:截取
Thirs列:坡度
这就是我所尝试的(只使用我的数据集的一个样本),但我只得到了所有结果的列表,并且我不知道如何将它们重新组合到一个数据帧中:
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)谢谢!
发布于 2012-02-22 06:06:48
我会使用plyr包,它对你有很好的好处:
ddply()将按单个或任何其他分组变量来估计lm(),默认情况下为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发布于 2012-02-22 06:04:07
我喜欢在这些情况下使用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发布于 2012-02-22 06:47:22
看看nlme包中的lmList。更普遍的是,您可能希望适合单个混合模型(nlme或lme4),而不是每个主题的单独模型。
https://stackoverflow.com/questions/9385882
复制相似问题