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")
我在 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")