我是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左右。
答案 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
的模型包括cyl
和wt
。但请注意,此模型的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
希望这能为您推进脚本提供一些灵感。