为什么用1个参数调用R update函数时会更改glmer fit?

为什么用1个参数调用R update函数时会更改glmer fit?,r,scope,R,Scope,下面是一个简化的代码,在我看来,这是Rupdate函数的一个问题: library('lme4') f <- function(formula) { data <- data.frame(a = c(4, 5), rowi = c(1, 2), b = c(2, 2)) fit0 <- glmer(formula, data = data, family = poisson(log)) fit1 <- update(fit0) cat('f likelih

下面是一个简化的代码,在我看来,这是R
update
函数的一个问题:

library('lme4')
f <- function(formula) {
  data <- data.frame(a = c(4, 5), rowi = c(1, 2), b = c(2, 2))
  fit0 <- glmer(formula, data = data, family = poisson(log))
  fit1 <- update(fit0)
  cat('f likelihoods: ', logLik(fit0), logLik(fit1), '\n')
}
g <- function() {
  f(a ~ -1 + (1|rowi) + offset(b))
  data <- data.frame(a = c(4, 5), rowi = c(1, 2), b = c(20, 40))
  f(a ~ -1 + (1|rowi) + offset(b))
  cat('g likelihood: ', logLik(glmer(a ~ -1 + (1|rowi) + offset(b),
      data = data, family = poisson(log))), '\n')
}
g()
data <- data.frame(a = c(4, 5), rowi = c(1, 2), b = c(50, 80))
g()
cat('global likelihood: ', logLik(glmer(a ~ -1 + (1|rowi) + offset(b),
    data = data, family = poisson(log))), '\n')

(对我来说)令人惊讶的是,
update(fit0)
操作会在公式环境中定义
数据时更改模型。为什么呢?如何正确使用
update
来避免这样的陷阱?

我也遇到过这种情况。简单的回答是
update.merMod(model)
使用
环境(公式(model))
来确定在重新安装模型时使用哪个环境(如果失败,那么它将尝试封闭环境,等等)。结果是
update()
使用创建公式的环境(而不是原始
merMod
对象的创建环境)重新安装模型。这与您编造的示例的行为一致

我解决这个问题的笨拙方法是将公式作为字符串传递,并确保将其转换为最初适合模型的同一函数体中的公式;e、 g

f <- function(formula_string) {
  formula <- as.formula(formula_string)
  data <- data.frame(a = c(4, 5), rowi = c(1, 2), b = c(2, 2))
  fit0 <- glmer(formula, data = data, family = poisson(log))
  fit1 <- update(fit0)
  cat('f likelihoods: ', logLik(fit0), logLik(fit1), '\n')
}
g <- function() {
  f("a ~ -1 + (1|rowi) + offset(b)")
  data <- data.frame(a = c(4, 5), rowi = c(1, 2), b = c(20, 40))
  f("a ~ -1 + (1|rowi) + offset(b)")
  cat('g likelihood: ', logLik(glmer(a ~ -1 + (1|rowi) + offset(b),
      data = data, family = poisson(log))), '\n')
}
f
update()。不确定多久我就能找到这个,但我也在网站上发布了一个链接
f <- function(formula_string) {
  formula <- as.formula(formula_string)
  data <- data.frame(a = c(4, 5), rowi = c(1, 2), b = c(2, 2))
  fit0 <- glmer(formula, data = data, family = poisson(log))
  fit1 <- update(fit0)
  cat('f likelihoods: ', logLik(fit0), logLik(fit1), '\n')
}
g <- function() {
  f("a ~ -1 + (1|rowi) + offset(b)")
  data <- data.frame(a = c(4, 5), rowi = c(1, 2), b = c(20, 40))
  f("a ~ -1 + (1|rowi) + offset(b)")
  cat('g likelihood: ', logLik(glmer(a ~ -1 + (1|rowi) + offset(b),
      data = data, family = poisson(log))), '\n')
}