2016-04-24 46 views
-1

我在for循環中生成30個子羣體的迴歸,並將它們分配給列表(矩陣?)的連續元素。似乎只有每個迴歸的第一個組成部分進入列表。簡單的版本是這樣的:R:將對象分配給循環中的向量

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()這個對象放到列表槽中。

+0

什麼樣的對象是gmRegs?如果它是一個列表,你可以用gmRegs [[1]] –

+0

'提取元素'(gapMeans,lm(DHt [Gap == i]〜Time [Gap == i]))'' lm(DHt〜Time,data = gapMeans,subset = Gap == i)' –

+0

@RichardTelford gmRegs start null;抱歉;忘了放那條線;編輯。關於澄清 - 我只是因爲這一切而結束了,所以這就是我所知道的。也只是編輯了我有c(與(...)),這是從另一個無果而終的嘗試。 – uhClem

回答

1

當您將lm作爲項保存到列表中時,lm本身是R中的結構化元素。如您所注意到的,運行str(num30)會返回包含13項內容的列表。如果你想每流明作爲一個元素保存在一個列表中,您可以執行以下操作:現在

# 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[[30]]訪問的每個gmRegs元素本身就是一個lm對象。

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

Example plot, since I can't embed images yet

+0

謝謝Michael;我看到我缺少的部分(除了乾淨的語法...)是用[[]]來解決這個問題。我已經有幾個星期了RTFMing,但這是一種仍然很難接受的事情。 – uhClem