R中的线性模型具有不同的变量组合

Rey*_*neh 5 variables automation r lm

我是R的新手,我遇到了问题.我试图在表中读取一组数据,我想执行线性建模.以下是我读取数据和变量名称的方法:

>data =read.table(datafilename,header=TRUE)
>names(data)
[1] "price"     "model"     "size"   "year"   "color"
Run Code Online (Sandbox Code Playgroud)

我想要做的是使用变量的不同组合(价格是目标)创建几个线性模型,例如:

> attach(data)
> model1 = lm(price~model+size)
> model2 = lm(price~model+year)
> model3 = lm(price~model+color)
> model4 = lm(price~model+size)
> model4 = lm(price~size+year+color)
#... and so on for all different combination...
Run Code Online (Sandbox Code Playgroud)

我的主要目的是比较不同的模型.是否有更聪明的方法来生成这些模型而不是对变量进行硬编码,尤其是在某些情况下我的变量数量将增加到13左右.

jlh*_*ard 7

如果您的目标是模型选择,则R中有几种工具可用于自动执行此过程.阅读有关文件dredge(...)MuMIn.

# dredge: example of use
library(MuMIn)
df <- mtcars[,c("mpg","cyl","disp","hp","wt")]  # subset of mtcars
full.model <- lm(mpg ~ cyl+disp+hp+wt,df)       # model for predicting mpg
dredge(full.model)
# Global model call: lm(formula = mpg ~ cyl + disp + hp + wt, data = df)
# ---
# Model selection table 
#    (Intrc)     cyl      disp       hp     wt df   logLik  AICc delta weight
# 10   39.69 -1.5080                    -3.191  4  -74.005 157.5  0.00  0.291
# 14   38.75 -0.9416           -0.01804 -3.167  5  -72.738 157.8  0.29  0.251
# 13   37.23                   -0.03177 -3.878  4  -74.326 158.1  0.64  0.211
# 16   40.83 -1.2930  0.011600 -0.02054 -3.854  6  -72.169 159.7  2.21  0.096
# 12   41.11 -1.7850  0.007473          -3.636  5  -73.779 159.9  2.37  0.089
# 15   37.11         -0.000937 -0.03116 -3.801  5  -74.321 161.0  3.46  0.052
# 11   34.96         -0.017720          -3.351  4  -78.084 165.6  8.16  0.005
# 9    37.29                            -5.344  3  -80.015 166.9  9.40  0.003
# 4    34.66 -1.5870 -0.020580                  4  -79.573 168.6 11.14  0.001
# 7    30.74         -0.030350 -0.02484         4  -80.309 170.1 12.61  0.001
# 2    37.88 -2.8760                            3  -81.653 170.2 12.67  0.001
# 8    34.18 -1.2270 -0.018840 -0.01468         5  -79.009 170.3 12.83  0.000
# 6    36.91 -2.2650           -0.01912         4  -80.781 171.0 13.55  0.000
# 3    29.60         -0.041220                  3  -82.105 171.1 13.57  0.000
# 5    30.10                   -0.06823         3  -87.619 182.1 24.60  0.000
# 1    20.09                                    2 -102.378 209.2 51.68  0.000
Run Code Online (Sandbox Code Playgroud)

您应该考虑使用这些工具来帮助您做出明智的决策.不要让工具为你做出决定!

例如,在这种情况下,dredge(...)建议mpg基于AICc标准的用于预测的"最佳"模型包括cylwt.但请注意,此模型的AICc为157.7,而第二个最佳模型的AICc为157.8,因此它们基本相同.实际上,此列表中的前5个模型的预测能力没有显着差异mpg.然而,它确实缩小了一些范围.在这5个中,我想在选择"最佳"模型之前,先看看残差的分布(应该是正常的),残差趋势(应该没有)和杠杆(做一些点有不当影响).


Mar*_*box 6

这是使用该combn函数获取所有变量组合的一种方法.它有点乱,并使用一个循环(也许有人可以改进这个mapply):

vars <- c("price","model","size","year","color")
N <- list(1,2,3,4)
COMB <- sapply(N, function(m) combn(x=vars[2:5], m))
COMB2 <- list()
k=0
for(i in seq(COMB)){
    tmp <- COMB[[i]]
    for(j in seq(ncol(tmp))){
        k <- k + 1
        COMB2[[k]] <- formula(paste("price", "~", paste(tmp[,j], collapse=" + ")))
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以调用这些公式并使用函数存储模型对象,list或者可能使用assign函数给出唯一的名称:

res <- vector(mode="list", length(COMB2))
for(i in seq(COMB2)){
    res[[i]] <- lm(COMB2[[i]], data=data)
}
Run Code Online (Sandbox Code Playgroud)


Joc*_*hem 5

您可以使用它stepwise multiple regression来确定要包含的变量.要开始这个,你要写一个lm()包含所有变量的语句,例如:

library(MASS)
fit <- lm(price ~ model + size + year + color)
Run Code Online (Sandbox Code Playgroud)

然后你继续:

step <- stepAIC(model, direction="both")
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用以下来显示结果:

step$anova
Run Code Online (Sandbox Code Playgroud)

希望这能为您推进脚本提供一些灵感.

  • `step`不保证所有模型组合都适合. (2认同)