2015-08-15 99 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]] 

}