首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glmulti与线性混合模型

glmulti与线性混合模型
EN

Stack Overflow用户
提问于 2013-12-06 17:10:56
回答 2查看 3.3K关注 0票数 1

我对和线性混合模型有一个问题。当我试图用coff.glmulti函数估计模型平均系数时,我得到了以下错误:

Data.frame中的错误(.,check.names = FALSE):参数意味着不同的行数: 1,0

我做了一些调试,发现问题从突出显示的coeff.glmulti函数行开始:

代码语言:javascript
复制
         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]]))**
 }

之后,当它试图在咖啡对象上应用getfit时,它就失败了。我认为,错误是由于lmer.fir对象的结构与lm或其他类型的模型对象不同造成的。

我正在粘贴一个最小的可重复的示例,以帮助那些想帮助我的人:

代码语言:javascript
复制
#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")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-27 14:46:47

如果您使用的是lme4的最新版本之一,那么我建议的getfit()函数将不再适用。实际上,lme4包维护人员在其包中做了相当多的更改:对象的类现在是"merMod",在这里它是"mer",还有其他一些东西。

然后,必须稍微调整getfit函数,以便与新的lme4结构进行接口glmulti。这里有一个getfit定义,它适用于Ubuntu12.04的最新lme4构建,截止到昨天:

代码语言:javascript
复制
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))))
})

这应该能解决问题。see also my website [http://vcalcagnoresearch.wordpress.com/package-glmulti/]

票数 1
EN

Stack Overflow用户

发布于 2013-12-06 18:07:52

在将令牌名从vy2更改为vy1之后,对glmulti的第一次调用不再引发错误,但这个调用会引发错误:

代码语言:javascript
复制
coef.glmulti(glmulti_lmm,select="all",varweighting="Johnson",icmethod="Burnham")

我不认为您突出显示的行是错误的来源,因为如果是的话,就会发出警告,而且对象有8个模型。我认为就在这一点之下,这条线出现了:

代码语言:javascript
复制
coke = lapply(coffee, getfit) # since that is step three in the traceback()

查看glmulti_lmm的内容,我们看到对象槽有8个模型:

代码语言:javascript
复制
> 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"

您没有说明您的目标是什么,但也许这说明了如何检查这些对象。对我来说,这是一个可疑的错误,你可能想要发送一个备忘录给包维护人员。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20429678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档