2013-07-09 63 views
0

我想自动运行许多回归模型并测试它并将拟合和残差保存在原始文件中。R代码:自动多元回归模型和测试

我的意思是我想测试所有可能的数据回归模型。

例如,X1 = X2 + X3 ...和X2 = X1 + X3 ...和X3 = X1 + X2 ...

然后添加拟合值和每个模型的残余值。

我有这样的文件。

test<-data.frame(X1=rnorm(50,mean=50,sd=10), 
       X2=rnorm(50,mean=5,sd=1.5), 
       X3=rnorm(50,mean=200,sd=25)) 
test$X1[10]<-5 
test$X2[10]<-5 
test$X3[10]<-530 

我运行所有可能的回归模型。

varlist <- names(test) 

models <- lapply(varlist, function(x) { 
    lm(substitute(i~., list(i = as.name(x))), data = data 
}) 

我得到了拟合和每个回归模型的残差。

lapply(models,residuals) 
lapply(models, fitted) 

但是,我想保存原始数据上的所有残差和拟合值。 是否有可能使这样的最终数据?

X1 X2 X3 Residual1 Residual2 Residual3 Fitted1 Fitted2 Fitted3 

residual1model1residual2model2

回答

0

我敢肯定,这可能有更紧凑的代码,但你可以尝试这样的

set.seed(1) 
test <- data.frame(X1 = rnorm(50, mean = 50, sd = 10), 
        X2 = rnorm(50, mean = 5, sd = 1.5), 
        X3 = rnorm(50, mean = 200, sd = 25)) 
test$X1[10] <- 5 
test$X2[10] <- 5 
test$X3[10] <- 530 


fitted_list <- lapply(names(test), function(x) 
         fitted(lm(as.formula(paste(x, ".", sep = "~")), 
               data = test))) 

resid_list <- lapply(names(test), function(x) 
        resid(lm(as.formula(paste(x, ".", sep = "~")), 
           data = test))) 


res <- do.call(cbind, c(fitted_list, resid_list)) 
res <- cbind(test, res) 
names(res) <- paste0(rep(c("X", "Fitted", "Resid"), each = 3), rep(1:3, 3)) 
str(res) 
## 'data.frame': 50 obs. of 9 variables: 
## $ X1  : num 43.7 51.8 41.6 66 53.3 ... 
## $ X2  : num 5.6 4.08 5.51 3.31 7.15 ... 
## $ X3  : num 184 201 177 204 184 ... 
## $ Fitted1: num 52 50.5 52.8 50.3 51.8 ... 
## $ Fitted2: num 5.23 5.17 5.25 5.09 5.18 ... 
## $ Fitted3: num 219 198 225 161 192 ... 
## $ Resid1 : num -8.28 1.35 -11.2 15.64 1.49 ... 
## $ Resid2 : num 0.367 -1.09 0.264 -1.788 1.97 ... 
## $ Resid3 : num -34.47 2.75 -47.44 43.11 -8.33 ... 
+0

东西太感谢你了!我知道了。 – user976856

0

不幸的是,“我跑所有可能的回归模型”在你的代码不能正常工作,但假设这只是一个例子,如何通过将lapply(模型,残差)和lapply(模型,拟合)作为变量保存列来将行绑定到原始数​​据集?然后遍历列数,结合他们从每个变量在一个时间:

models_residuals <- lapply(models,residuals) 
models_fitted <- lapply(models, fitted) 
for (i in 1:dim(models_residuals)[2])) { 
    cbind(test, models_residuals[,i]) 
    cbind(test, models_fitted[,i])  
} 

让我知道如果我对你想要的东西的想法是正确的!