R:将对象分配给循环中的向量

R: assigning objects to vector in loop

我在 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() 对象装箱到列表槽中。

当您将 lm 作为项目保存到列表时,lm 本身是 R 中的结构化元素。正如您所指出的,运行 str(num30) returns 列表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)returns

  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

正如 Richard 上面指出的那样,您可以将 with 调用重写为以下 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[[30]] 访问的 gmRegs 的每个元素本身就是一个 lm 对象。

plot(gapMeans$time[gapMeans$gap==30], gapMeans$response[gapMeans$gap==30], xlab = 'time', ylab = 'response')
abline(gmRegs[[30]]$coefficients, col = "red")