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

时间:2012-02-21 21:59:18

标签: r

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

第一栏:个人身份

第二栏:拦截

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)

谢谢!

3 个答案:

答案 0 :(得分:3)

我会使用包plyr,这对您有好处:

  1. function ddply()将按个人或您指定的任何其他分组变量估算lm()
  2. 默认情况下返回data.frame
  3. 代码:

    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。更一般地说,您可能希望适合单个混合模型(nlmelme4)而不是每个主题的单个模型。