2012-02-21 49 views
2

我有個人身體狀況指數的時間系列。我想爲每個人確定身體狀況指數隨時間的變化。換句話說,我想創建一個線性迴歸的每一個人,然後收集所有結果(截距和斜率)成數據幀,將是這樣的:用簡單的線性迴歸的結果創建一個數據框

第一欄:單獨的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) 

謝謝!

回答

3

我會用這對你有一些不錯的福利包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 
+0

(+1)對於整個問題,使用'plyr'不公平! – Justin 2012-02-21 22:11:17

+1

@Justin - 工作更聰明:) Hadley在他的論文中有一個非常相似的例子,他使用plyr從lm()模型中製作100個診斷圖。 – Chase 2012-02-21 22:15:08

+1

以下是該論文的鏈接:_數據分析的拆分應用組合戰略_ http://www.jstatsoft.org/v40/i01/paper](http://www.jstatsoft.org/v40/i01 /紙) – bdemarest 2012-02-21 23:26:26

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

nlme包看lmList。更一般地說,您可能想要爲每個主題擬合單個混合模型(nlmelme4),而不是單個模型。

+0

謝謝,我已經使用lme分析我的數據,個人lm是爲了另一個目的。 – 2012-02-22 13:51:02

相關問題