【问题标题】:Create a dataframe with the results of a simple linear regression使用简单线性回归的结果创建数据框
【发布时间】:2012-02-22 06:47:22
【问题描述】:

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

第一列:个人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)

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我会使用 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,或者只是想知道如何使用基础 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) 使用plyr 解决整个问题是不公平的!
    • @Justin - 更聪明地工作而不是更努力地工作 :) Hadley 在他关于 plyr 的论文中有一个非常相似的例子,他使用 plyr 从 lm() 模型中制作了 100 个诊断图。
    • 这是该论文的链接:The Split-Apply-Combine Strategy for Data Analysis http://www.jstatsoft.org/v40/i01/paper
    • 工作更聪明,我喜欢这样!谢谢!
    • 使用 plyr 是一种懒惰的方法,只是一种逃避现实的方法。以最难的方式学习。
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      查看nlme 包中的lmList。更一般地,您可能希望拟合单个混合模型(nlmelme4),而不是每个主题的单独模型。

      【讨论】:

      • 谢谢,我已经用 lme 来分析我的数据了,个别的 lm 另有用途。
      猜你喜欢
      • 2018-07-23
      • 2020-06-20
      • 2021-08-13
      • 1970-01-01
      • 2017-12-01
      • 2013-03-15
      • 1970-01-01
      • 2018-12-13
      • 2019-01-19
      相关资源
      最近更新 更多