2015-08-15 123 views
0

我有一個變量名稱如x1,y1,x2,y2等的數據集。我想回歸y1〜x1,y2〜x2,.....我想用for循環自動做這個,到目前爲止我還沒有成功。以下是示例代碼:使用線性迴歸在r中循環變量名稱

x1 <- c(1,2,3,4) 
y1 <- c(10,20,30,40) 

x2 <- c(3,6,9,12) 
y2 <- c(1,2,3,4) 


dataz <- as.data.frame(cbind(x1,y1,x2,y2)) 

coef <- rep(NA,2)               

for (i in 1:2){ 

    coef[i] <- (lm(x[i]~y[i],data=dataz))$coefficients[[2]] } 

下面是我得到的錯誤。 Error in eval(expr, envir, enclos) : object 'y' not found.

我試過使用paste,但不知道如何繼續。任何幫助將不勝感激。下面

+0

這個前面的問題可能會有所幫助:http://stackoverflow.com/questions/20366423/variable-scope-resolution-in-r-function – MrFlick

+0

或者,這可能會有所幫助:http://www.ats.ucla.edu/stat/r/pages/looping_strings.htm – MrFlick

回答

2
  • 代碼更新保存流明()摘要變量*

我想很簡單的東西。我寫了一個循環,其中我使用「paste0」函數將「x」和「y」粘貼到迭代編號,並使用「get」函數獲取字符串引用的對象。這個解決方案只有在你的變量名稱的一部分是常量並且你可以遍歷變化的變量名稱部分時才起作用。順便說一下,我也改變了你的數據,因爲你的x與你的y完全相關,從而使你的協方差矩陣爆炸,可以這麼說。下面的代碼,我希望它能幫助:

x1 <- c(runif(40)) 
y1 <- c(sample(50:300, 40, replace = TRUE)) 

x2 <- c(runif(40)) 
y2 <- c(sample(225:975, 40, replace = TRUE)) 

dataz <- as.data.frame(cbind(x1,y1,x2,y2)) 


for (i in 1:2){ 
    assign(paste0("coef", i), summary(lm(paste0("x", i, "~", "y", i)))) 
} 
+0

此外,我意識到您想將您的迴歸摘要保存到「coef」變量,所以我剛剛替換帶有「分配」功能的「打印」命令可以在代碼中執行該操作。 X1 < - C(runif(40)) Y1 < - C(樣品(50:300,40,替換= TRUE)) X2 < - C(runif(40)) Y2 < - C(樣品(225:975,40,替換= TRUE)) DATAZ < - as.data.frame(cbind(X1,Y1,X2,Y2)) 爲(I在1:2){ assign(paste0(「coef」,i),summary(lm(get(paste0(「x」,i))〜get(paste0(「y」,i))))012,347,} –

+0

非常棒,非常感謝。一個問題,當我訪問摘要時,而不是變量名稱,我得到了past0(''x'',i))而不是x1。謝謝 – forecaster

+0

對不起。發生這種情況是因爲get()函數會拉取「y1」或「y2」所指的數據集而不是變量的名稱。 將「for」循環中的最後一行替換爲:assign(paste0(「coef」,i),summary(lm(paste0(「x」,i,「〜」,「y」,i)))) 我忘了lm()函數可以將字符串作爲參數。 –

1

這裏是一個for循環解決方案與雙括號明確referencing the dataframe column涉及。所以,事實上,在lm()數據參數可以將其刪除:

for (i in 1:2){ 
    coef[i] <- (lm(dataz[[paste0("y", i)]] ~ dataz[[paste0("x", i)]]))$coefficients[[2]] 

}