2017-08-02 103 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