2017-08-02 62 views
1

例如,考虑数据帧df由3个变量v1,v2,v3组成。

v1=rnorm(10,mean=1,sd=2) 
v2=rnorm(10,mean=2,sd=2) 
v3=rnorm(10,mean=3,sd=2) 
df=data.frame(v1,v2,v3) 

现在我想用for循环做线性回归:

for (i in names(df)){ 
    fit <- lm(i~.,data=df) 
} 

又来了一个错误。我想要的是将循环变量i从v1运行到v3,但循环变量i实际上是“v1”到“v3”。我该如何处理这个问题?

我知道有一些其他的方式,如使用DF [我],而不是我在表现公式,但是,当我用newdata预测,这将导致错误:

train <- df[1:5,] 
test <- df[6:10,] 

for (i in names(df)){ 
    fit <- lm(train[,i]~.,data=train) 
    predict<- predict(fit,newdata=test[,!(colnames(test) %in% i)]) 
} 

另外,我真的想用〜。而不是〜v2 + v3,因为实际上我有200个变量。

真的希望得到您的回复!

回答

1

计算:

for (i in names(df)){ 
    y <- as.name(i) 
    fit <- eval(bquote(lm(.(y) ~ ., data = train))) 
    predict <- predict(fit, newdata = test) 
} 
+0

将'print(fit)'中的公式与@ jlesuffleur的答案相比较。我的解决方案更安全,因为它避免了潜在的范围问题。 – Roland

1

使用formula:在语言

for (i in names(df)){ 
    form <- formula(paste0(i, "~.")) 
    fit <- lm(form, data = df) 
} 
+1

感谢您张贴的答案。它运作良好!非常抱歉,我的声望低于15,因此投票不显示。 – gaoming