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

时间:2014-04-09 07:25:20

标签: r variables automation lm

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

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

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

> 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...

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

3 个答案:

答案 0 :(得分: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=" + ")))
    }
}

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

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

答案 1 :(得分:6)

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

# 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

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

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

答案 2 :(得分:5)

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

library(MASS)
fit <- lm(price ~ model + size + year + color)

然后继续:

step <- stepAIC(model, direction="both")

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

step$anova

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