AICcmodavg lm不会运行带有2个变量的加法模型

时间:2016-01-06 14:17:30

标签: r lm

上下文 理想情况下,我想运行一个模型列表,同时考虑所有模型。由于我无法使其工作,我运行了三组模型分别处理1,2和3变量。

问题 虽然1和3变量模型运行良好,但线性回归不会运行加性2变量模型,但会运行交互项(我不想要)。线性回归将在包之外运行,因此它不是自由度或负值问题,但我很难过。有没有人有任何想法?

数据

lre<-c(0.398,0,0.9298,1.470,0)
imm1<-c(-0.54,-1.67,0.07.96,-0.862,1.02)
imm2<-c(-0.033,4.3798,0.0358,-1.045,0.592)
met1<-c(-1.689,-1.06,1.156,-1.574,1.632)
met2<-c(-1.980,1.349,1.538,0.6303,-0.310)
phy1<-c(0.202,0.368,-0.643,2.274259,0.847)
phy2<-c(1.079,-0.068,-1.438,-0.716,0.846)

1变量=有效

library(AICcmodavg) 
Cand.models <- list( )
Cand.models[[1]]<-lm(lre~imm1)
Cand.models[[2]]<-lm(lre~imm2)
Cand.models[[3]]<-lm(lre~met1)
Cand.models[[4]]<-lm(lre~met2)
Cand.models[[5]]<-lm(lre~phy1)
Cand.models[[6]]<-lm(lre~phy2)
Modnames <- paste("mod", 1:length(Cand.models), sep = " ")
aictab(cand.set = Cand.models, modnames = Modnames, sort = TRUE)

添加模型中的2个变量=不起作用

Cand.models <- list( )
Cand.models[[1]]<-lm(lre~imm1+imm2)
Cand.models[[2]]<-lm(lre~imm1+met2)
Cand.models[[3]]<-lm(lre~imm1+phy2)
Modnames <- paste("mod", 1:length(Cand.models), sep = " ")
aictab(cand.set = Cand.models, modnames = Modnames, sort = TRUE)

警告讯息: 在aictab.AIClm中(cand.set = Cand.models,modnames = Modnames,sort = TRUE): 仔细检查模型结构,因为某些模型可能是多余的

...然而

有互动的2个变量=工作

Cand.models <- list( )
Cand.models[[1]]<-lm(lre~imm1*imm2)
Cand.models[[2]]<-lm(lre~imm1*met2)
Cand.models[[3]]<-lm(lre~imm1*phy2)
Modnames <- paste("mod", 1:length(Cand.models), sep = " ")
aictab(cand.set = Cand.models, modnames = Modnames, sort = TRUE)

加性模型中的3个变量=工作

Cand.models <- list( )
Cand.models[[1]]<-lm(lre~imm1+imm2+met1)
Cand.models[[2]]<-lm(lre~imm1+imm2+met2)
Cand.models[[3]]<-lm(lre~imm1+imm2+phy1)
Cand.models[[4]]<-lm(lre~imm1+imm2+phy2)
Modnames <- paste("mod", 1:length(Cand.models), sep = " ")
aictab(cand.set = Cand.models, modnames = Modnames, sort = TRUE)

1 个答案:

答案 0 :(得分:0)

警告有点误导。它报告模型可能是相同的,因为它们都具有相同的AICc,在这种情况下为Inf。它是 一个自由度问题,在这个意义上,自由度与观察数量减去一个相匹配。因此,当AICcmodavg:::AICc.lm使用公式时:

AICc <- -2 * LL + 2 * K * (n/(n - K - 1))

n = 5,样本数量和K = 4,参数数量(全局截距,imm1imm2)加上误差方差的一个,最后一个词是(5/0)(Inf)。幸运的是,在您的情况下,所有潜在模型都具有相同的K,这意味着AIC中的相对差异将与AICc工作时的相对差异相匹配(Wikipedia ):

lre <- c(0.398, 0, 0.9298, 1.470, 0)
imm1 <- c(-0.54, -1.67, 0.0796, -0.862, 1.02) # fixed typo
imm2 <- c(-0.033, 4.3798, 0.0358, -1.045, 0.592)
met1 <- c(-1.689, -1.06, 1.156, -1.574, 1.632)
met2 <- c(-1.980, 1.349, 1.538, 0.6303, -0.310)
phy1 <- c(0.202, 0.368, -0.643, 2.274259, 0.847)
phy2 <- c(1.079, -0.068, -1.438, -0.716, 0.846)

# Put everything in a data frame for cleanliness
dat <- data.frame(lre, imm1, imm2, met1, met2, phy1, phy2)

Cand.models <- list()
Cand.models[[1]]<-lm(lre ~ imm1 * imm2, data = dat)
Cand.models[[2]]<-lm(lre ~ imm1 * met2, data = dat)
Cand.models[[3]]<-lm(lre ~ imm1 * phy2, data = dat)
Modnames <- paste("mod", 1:length(Cand.models), sep = " ")
aictab(cand.set = Cand.models, modnames = Modnames, sort = TRUE)

Model selection based on AICc :

      K   AICc Delta_AICc AICcWt Cum.Wt    LL
mod 1 5 -55.53       0.00   0.99   0.99  2.77
mod 2 5 -45.60       9.94   0.01   1.00 -2.20
mod 3 5 -44.42      11.12   0.00   1.00 -2.79

现在使用second.ord = FALSE(只返回AIC):

aictab(cand.set = Cand.models, modnames = Modnames, sort = TRUE, second.ord = FALSE)

Model selection based on AIC :

      K   AIC Delta_AIC AICWt Cum.Wt    LL
mod 1 5  4.47      0.00  0.99   0.99  2.77
mod 2 5 14.40      9.94  0.01   1.00 -2.20
mod 3 5 15.58     11.12  0.00   1.00 -2.79

因此,只要您的所有模型具有相同数量的系数,您就可以使用常规AIC获得相同(有效)的结果。