我有一个数据库,我在这个数据库中比较一段时间内螃蟹的适应率。我想为每个人创建一个线性回归,然后将所有结果(截距,斜率和R ^ 2值)收集到一个看起来像这样的数据框中:
第1栏:蟹ID
第二栏:拦截
第3栏:坡度
第4栏:R ^ 2
我的数据库看起来与此类似,但数据点更多(每个人翻译132次,超过50人)
ID Enclosure Flip Num Time taken
2 Simple 1 0.5
2 Simple 2 0.8
2 Simple 3 0.41
2 Simple 4 0.44
4 Bare 1 0.37
4 Bare 2 0.41
4 Bare 3 1.06
4 Bare 4 0.59
5 Simple 1 1.88
5 Simple 2 1.88
5 Simple 3 2.04
5 Simple 4 2.66
6 Complex 1 1.87
6 Complex 2 1.96
6 Complex 3 1.56
6 Complex 4 2.34
9 Complex 1 0.44
9 Complex 2 2.35
9 Complex 3 2.22
9 Complex 4 3.22
我在另一个问题上找到了这个代码,但这只带回了拦截和斜率:
library(plyr)
ddply(test, "individual", function(x) {
model <- lm(condition ~ day, data = x)
coef(model)
})
答案 0 :(得分:0)
使用split
和sapply
,如下所示。正如评论中所提到的,数据集和您的代码具有不同的列。在本例中,我选择了两列,以生成模型。
生成数据
str <- 'ID Enclosure FlipNum Timetaken
2 Simple 1 0.5
2 Simple 2 0.8
2 Simple 3 0.41
2 Simple 4 0.44
4 Bare 1 0.37
4 Bare 2 0.41
4 Bare 3 1.06
4 Bare 4 0.59
5 Simple 1 1.88
5 Simple 2 1.88
5 Simple 3 2.04
5 Simple 4 2.66
6 Complex 1 1.87
6 Complex 2 1.96
6 Complex 3 1.56
6 Complex 4 2.34
9 Complex 1 .44
9 Complex 2 2.35
9 Complex 3 2.22
9 Complex 4 3.22'
file <- textConnection(str)
df <- read.table(file, header = T)
df
获取所有系数
sapply(split(df, df$ID),function(x) {
model <- lm(Timetaken ~ FlipNum, data = x)
c(ID = x$ID[1],coef(model),R2 = summary(model)[['r.squared']])
})
结果:
2 4 5 6 9
ID 2.0000000 4.0000000 5.0000000 6.0000000 9.0000000
(Intercept) 0.6800000 0.2800000 1.4900000 1.6800000 0.0050000
FlipNum -0.0570000 0.1310000 0.2500000 0.1010000 0.8210000
R2 0.1690867 0.2855645 0.7564754 0.1648114 0.8260964