1

我想自动运行许多回归模型并对其进行测试并将拟合和残差保存在原始文件中。

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

例如,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

所以那residual1是从model1residual2是从model2,等等。

4

2 回答 2

1

不幸的是,您在“我运行所有可能的回归模型”下的代码无法正常工作,但假设这只是一个示例,那么通过保存 lapply(models, residuals) 和 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])    
}

让我知道我对您想要什么的想法是否正确!

于 2013-07-09T13:59:24.560 回答
1

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

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 ...
于 2013-07-09T14:29:47.443 回答