【问题标题】:using as.formula() in glmer and dredging it with MuMIn在 glmer 中使用 as.formula() 并用 MuMIn 对其进行疏浚
【发布时间】:2013-11-16 22:22:50
【问题描述】:

我正在尝试使用MuMIn 包中的dredge 函数,如下所示。因为我想为不同的数据集运行它,所以我使用了一个函数,它接受协变量的向量,公式是从函数内的这个向量创建的。

require(lme4);require(MuMIn)
x1 <- rnorm(100)
x2 <- rnorm(100)
zrand <- sample(letters, 100, replace =T)
yind <- sample(1:1000, size=100, replace=T)
mydata <- data.frame(yind, x1, x2, zrand)
vars <- c('x1', 'x2')

当我以这种方式运行它时,我得到符号不可子集的错误。我认为这与在公式中使用 vars 有关,尽管 lmer 运行良好

myformula <- as.formula(paste('yind~',paste(vars,collapse='+'),'+(1|zrand)'))

mylmer1 <- lmer(myformula, mydata, gaussian)

dredge(mylmer1)

术语错误(as.formula(formula(x))) : 在为函数“terms”选择方法时评估参数“x”时出错:错误:“symbol”类型的对象不是子集

但这工作正常,原因我不完全理解,但与疏浚功能的范围有关。 (我可能在这里完全不合时宜)

mylmer2 <- lmer(as.formula(paste('yind~',paste(vars,collapse='+'),'+(1|zrand)')), 
              mydata, gaussian)

dredge(mylmer2)

我在分析中所做的更类似于此,其中 lmer 和 dredge 在函数内运行

myfn <- function(fnd,fnvar){
  myformula <- as.formula(paste('yind~',paste(fnvar,collapse='+'),'+(1|zrand)'))
    print(myformula)

mylmer1 <- lmer(myformula, fnd, gaussian)
    print(mylmer1@call)
  print(dredge(mylmer1))

  mylmer2 <- lmer(as.formula(paste('yind~',paste(fnvar,collapse='+'),'+(1|zrand)')), 
                fnd, gaussian)

  print(mylmer2@call)
  print(dredge(mylmer2))
  }

myfn(fnd=mydata, fnvar=vars)

Dredgin 只有 lmer1 给出这个错误:

Error in print(dredge(mylmer1)) : 
  error in evaluating the argument 'x' in selecting a method for function 'print': Error in terms(as.formula(formula(x))) : 
  error in evaluating the argument 'x' in selecting a method for function 'terms': Error: object of type 'symbol' is not subsettable

只挖lmer2,报如下错误

Error in print(dredge(mylmer2)) : 
  error in evaluating the argument 'x' in selecting a method for function 'print': Error in terms(as.formula(formula(x))) : 
  error in evaluating the argument 'x' in selecting a method for function 'terms': Error in paste(fnvar, collapse = "+") : object 'fnvar' not found.

有没有办法解决这个问题?这是疏浚功能的必要限制吗?

【问题讨论】:

  • 这适用于lme4 (1.1-1) 的开发版本;你使用的是什么版本的lme4? (我也鼓励你使用lmer 而不是glmer(...,family=gaussian) ...)
  • 感谢@BenBolker。我的lme4 版本是“0.999999.2”。我更新了lme4,但可能没有unloadNamespace,所以我被旧版本卡住了!我的数据是二进制的,所以我使用glmer(family=binomial)。这里只是一个示例,但会进行编辑以避免混淆。
  • 奇怪!我将lme4 更新为 1.0.5。现在我得到:“validObject(.Object) 中的错误:无效类“mer”对象:当运行 lmer 本身时,插槽 L 必须是大小 dims['q'] 的单调 LL' 分解”
  • 开发版 1.1-1 可以正常工作。再次感谢!
  • 您的 1.0.5 问题是没有先重新安装 MatrixRcppEigen ...

标签: r lme4


【解决方案1】:

我找到了解决方案here。显然它被称为“deparse-substitute技巧”。

mylmer1@call$formula <- tmp.formula

在挖掘mer 对象之前

错过了,因为我认为这与 MuMIn 有关。

【讨论】:

  • lme4 版本 1.1-1 工作正常,无需“deparse-substitute”
猜你喜欢
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 2015-07-27
  • 2021-08-13
  • 2014-05-15
  • 1970-01-01
相关资源
最近更新 更多