我在for循环中生成了30个子群体的回归,并将它们分配给列表的连续元素(矩阵?)。似乎只有每个回归的第一个组成部分才能进入列表。简单的版本是这样的:
i <- 30
num30 <- with(gapMeans, lm(DHt[Gap==i] ~ Time[Gap==i]))
按我的意愿工作。循环版本:
gmRegs <- NULL
for (i in 1:30){
gmRegs[i] <- with(gapMeans,
if(Ht[Gap==i][1] > 1){
lm(DHt[Gap==i] ~ Time[Gap==i])
} else {NULL}
)}
运行正常但是:
num30
# Call:
# lm(formula = DHt[Gap == i] ~ Time[Gap == i])
#
# Coefficients:
# (Intercept) Time[Gap == i]
# 24.56874 -0.01546
gmRegs[30]
# [[1]]
# (Intercept) Time[Gap == i]
# 24.56874082 -0.01546019
str()
将num30
描述为13的列表,而gmRegs[30
]是1的列表,当我尝试abline(reg=gmRegs[30])
时,它不会。所以看起来我的作业只做了thing1[1] <- thing2[1]
,或者是那种效果 - 我只是无法弄清楚如何正确地将lm()
对象整理到所有适合列表槽中。< / p>
答案 0 :(得分:1)
当您将lm作为项目保存到列表中时,lm本身是R中的结构化元素。如您所知,运行str(num30)
会返回13个事项的列表。如果要将每个lm保存为列表中的元素,可以执行以下操作:
# generate random data
response <- runif(90,0,1)
time <- runif(90,10,20)
gap <- rep(1:30,3)
gapMeans <- data.frame(gap,response,time)
现在,head(gapMeans)
返回
gap response time
1 1 0.6809973 12.66655
2 2 0.5473042 11.73821
3 3 0.6095777 18.96527
4 4 0.3081830 15.62343
5 5 0.1640612 13.42454
6 6 0.8473997 12.83730
正如理查德在上面指出的那样,你可以将你的呼叫重写为以下lm:
num30 <- lm(response[gap==30] ~ time[gap==30], data = gapMeans)
现在您的循环可以简单地写下以下内容:
gmRegs <- NULL
for(i in 1:30){
gmRegs[[i]] <- lm(response[gap==i] ~ time[gap==i], data= gapMeans)
}
现在,通过gmRegs
访问的gmRegs[[30]]
的每个元素本身都是一个lm对象。
plot(gapMeans$time[gapMeans$gap==30], gapMeans$response[gapMeans$gap==30], xlab = 'time', ylab = 'response')
abline(gmRegs[[30]]$coefficients, col = "red")