我遇到了glmulti软件包和线性混合模型的问题。 当我尝试使用coff.glmulti函数估计模型平均系数时,我得到了这个错误:
data.frame(...,check.names = FALSE)中的错误:参数暗示 不同的行数:1,0
我进行了一些调试,发现问题始于coeff.glmulti函数的高亮显示行:
if (length(object@adi) >= 1)
for (j in 1:length(object@adi)) {
cak[[length(names(cak)) + 1]] = object@adi[[j]]
names(cak)[length(names(cak))] = names(object@adi)[j]
}
modf = eval(cak)
coffee = c(coffee, list(modf))
}
}
if (length(coffee) == 1) {
warning("Only one candidate: standard conditional inference was performed.")
**return(coef(coffee[[1]]))**
}
之后,当它尝试在 coffee 对象上应用 getfit 时,它会失败。我认为错误是由于lmer.fir对象的不同结构与lm或其他类型的模型对象有关。
我正在粘贴一个最小的可重复示例,以方便谁想要帮助我:
#Add the required package
library(lme4)
library(glmulti)
# A random vector of count data
vy1<-round(runif(100, min=1,max=20)*round(runif(100,min=1,max=20)))
# Predictors
va = runif(100,min=1,max=100)
vb = runif(100,min=,max=100)
random_effect <- as.factor(rep(c(1,2,3,4),each=25))
pippo<-as.data.frame(cbind(vy1,va,vb,random_effect))
form_glmulti = as.formula(paste("vy1~va*vb"))
# The wrapper function for linear mixed-models
lmer.glmulti<-function(formula,data,random="",...){
lmer(paste(deparse(formula),random),data=data,REML=F,...)
}
# The wrapper function for linear models
lm.glmulti<-function(formula,data,...){
lm(paste(deparse(formula)),data=data,...)
}
# Multi selection for lmer
glmulti_lmm<-glmulti(form_glmulti,random="+(1|random_effect)",data=pippo,method="h",
fitfunc=lmer.glmulti, intercept=TRUE,marginality=FALSE,level=2)
# Model selection for lm
glmulti_lm<-glmulti(form_glmulti,data=pippo,method="h",fitfunc=lm.glmulti,intercept=TRUE,
marginality=FALSE, level=2)
# Coeffs estimation lmer #Here the error
coef.glmulti(glmulti_lmm,select="all",varweighting="Johnson",icmethod="Burnham")
#Coeffs estimation lm #With lm everything is ok
coef(glmulti_lm,varweighting="Johnson",icmethod="Burnham",select="all")
答案 0 :(得分:1)
如果您使用的是最新版本的lme4,我推荐的getfit()函数将不再适用。事实上,lme4软件包维护者在他们的软件包中做了很多改变:对象类现在是&#34; merMod&#34;,它是&#34; mer&#34;以及其他一些东西。
然后必须稍微调整getfit函数,以便将glmulti与新的lme4结构接口。这是一个getfit定义,适用于Ubuntu 12.04的最新lme4版本,截至昨天:
setMethod('getfit', 'merMod', function(object, ...) {
summ=summary(object)$coef
summ1=summ[,1:2]
if (length(dimnames(summ)[[1]])==1) {
summ1=matrix(summ1, nr=1, dimnames=list(c((Intercept)"),c("Estimate","Std. Error")))
}
cbind(summ1, df=rep(10000,length(fixef(object))))
})
这应该可以解决问题。 [另见我的网站http://vcalcagnoresearch.wordpress.com/package-glmulti/] 此致
答案 1 :(得分:0)
将令牌名称从vy2更改为vy1后,对glmulti的第一次调用不再引发错误,但是这个错误:
coef.glmulti(glmulti_lmm,select="all",varweighting="Johnson",icmethod="Burnham")
我不认为您突出显示的行是错误的来源,因为如果它已发出警告,此外该对象有8个模型。我认为就在这一行出现的那一点之下:
coke = lapply(coffee, getfit) # since that is step three in the traceback()
查看glmulti_lmm
的内容,我们看到对象槽有8个模型:
> summary(glmulti_lmm)$bestmodel
[1] "vy1 ~ 1"
> glmulti_lmm@objects[[1]]
Linear mixed model fit by maximum likelihood ['lmerMod']
Formula: vy1 ~ 1 + (1 | random_effect)
Data: data
AIC BIC logLik deviance
1183.9965 1191.8120 -588.9983 1177.9965
Random effects:
Groups Name Std.Dev.
random_effect (Intercept) 0.00
Residual 87.45
Number of obs: 100, groups: random_effect, 4
Fixed Effects:
(Intercept)
105.5
> coef( glmulti_lmm@objects[[1]])
$random_effect
(Intercept)
1 105.48
2 105.48
3 105.48
4 105.48
attr(,"class")
[1] "coef.mer"
你没有说出你的目标是什么,但也许这表明了如何检查这些物体。对我来说,这是一个可疑的错误,你可能想要一个备忘录发送给包维护者。