背景
我正在尝试根据某些参数在函数中拟合混合模型。如果我想使用contrast
fromlibrary(contrast)
我必须使用一种解决方法, ascontrast
使用对象中的call
插槽lme
来确定函数中传递给的data
, fixed
or参数(参见代码)。顺便说一句,对象并非如此。random
lme
lm
数据
set.seed(1)
dat <- data.frame(x = runif(100), y1 = rnorm(100), y2 = rnorm(100),
grp = factor(sample(2, 100, replace = TRUE)))
代码
library(contrast)
library(nlme)
makeMixedModel1 <- function(resp, mdat = dat) {
mF <- formula(paste(resp, "x", sep = "~"))
mdat <- mdat[resp > 0, ]
mod <- lme(mF, random = ~ 1 | grp, data = mdat)
mC <- mod$call
mC$fixed <- mF
mC$data <- mdat
mod$call <- mC
mod
}
makeMixedModel2 <- function(resp, mdat = dat) {
mF <- formula(paste(resp, "x", sep = "~"))
mdat <- mdat[resp > 0, ]
lme(mF, random = ~ 1 | grp, data = mdat)
}
mm1 <- makeMixedModel1("y1")
mm2 <- makeMixedModel2("y1")
contrast(mm1, list(x = 1)) ## works as expected
# lme model parameter contrast
#
# Contrast S.E. Lower Upper t df Pr(>|t|)
# 0.1613734 0.2169281 -0.2692255 0.5919722 0.74 96 0.4588
contrast(mm2, list(x = 1)) ## gives an error
# Error in eval(expr, envir, enclos) : object 'mF' not found
问题
我已将错误追踪到contrast
评估whisfixed
插槽内的call
插槽的部分,当然这在顶层是未知的,因为它仅在我的函数内部定义。通过显式覆盖.mm2
mF
makeMixedModel2
makeMixedModel1
call
显然,对于lm
对象,这是以更智能的方式解决的,因为不需要手动覆盖,因为contrast
似乎可以评估正确上下文中的所有部分,当然mF
也不mdat
知道:
makeLinearModel <- function(resp, mdat = dat) {
mF <- formula(paste(resp, "x", sep = "~"))
mdat <- mdat[resp > 0, ]
lm(mF, data = mdat)
}
contrast(makeLinearModel("y1"), list(x = 1))
因此,我假设lm
存储 theformula
和data
某处的值,以便 in 也可以在不同的环境中检索。
我可以接受我的解决方法,尽管它有一些丑陋的副作用,因为它print(mm1)
显示了所有数据而不是简单的名称。所以我的问题是,是否还有其他策略可以实现我的意图?或者我是否必须写信给 的维护者contrast
并询问他,他是否可以更改lme
对象的代码,以使他不再依赖call
插槽,而是尝试以其他方式解决问题(就像为 所做的那样lm
)?