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左右.
如果您的目标是模型选择,则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标准的用于预测的"最佳"模型包括cyl和wt.但请注意,此模型的AICc为157.7,而第二个最佳模型的AICc为157.8,因此它们基本相同.实际上,此列表中的前5个模型的预测能力没有显着差异mpg.然而,它确实缩小了一些范围.在这5个中,我想在选择"最佳"模型之前,先看看残差的分布(应该是正常的),残差趋势(应该没有)和杠杆(做一些点有不当影响).
这是使用该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)
您可以使用它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)
希望这能为您推进脚本提供一些灵感.
| 归档时间: |
|
| 查看次数: |
4179 次 |
| 最近记录: |