gpt4 book ai didi

r - 在函数中创建 lme 对象

转载 作者:行者123 更新时间:2023-12-04 11:12:55 27 4
gpt4 key购买 nike

背景

我正在尝试根据某些参数在函数中拟合混合模型。如果我想使用 contrast来自 library(contrast)我必须使用变通方法,如 contrast使用 call来自 lme 的插槽确定 data 的对象, fixedrandom参数传递给 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 的部分评估 fixed call 内的插槽mm2 的插槽whis 等于 mF这在顶层当然是不知道的,因为它只在我的函数中定义 makeMixedModel2 . makeMixedModel1 中的解决方法通过显式覆盖 call 中的相应插槽来补救.

显然,对于 lm objects 这是以更聪明的方式解决的,因为不需要像 contrast 那样手动覆盖似乎在正确的上下文中评估了所有部分,当然 mFmdat也不知道:

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存储 formula 的值和 data某处,这样 in 也可以在不同的环境中检索。

我可以接受我的解决方法,尽管它有一些丑陋的副作用,如 print(mm1)显示所有数据而不是简单的名称。所以我的问题是,是否有其他一些策略可以实现我的意图?或者我必须写信给 contrast 的维护者吗?并问他是否可以更改 lme 的代码他不再依赖 call 的对象插槽,但尝试以其他方式解决问题(就像为 lm 所做的那样)?

最佳答案

我认为你正在战斗的只是 lme 对象的 contrast() 的错误实现。我会联系作者修复它(这可能是最近使用 nlme 更改的结果)。但与此同时,您可以通过在 contrast.lme() 函数中而不是在模型构造函数中实现解决方法来避免副作用:

contrast.lme <- function(fit, ...) {
mC <- fit$call
mC$fixed <- formula(fit)
mC$data <- fit$data
fit$call <- mC

library(nlme)
contrast:::contrastCalc(fit, ...)
}
assignInNamespace("contrast.lme", contrast.lme, "contrast")

mm2 <- makeMixedModel2("y1")

contrast(mm2, list(x = 1))

产量:

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

和:

print(mm2)

产量:

Linear mixed-effects model fit by REML
Data: mdat
Log-restricted-likelihood: -136.2472
Fixed: mF
(Intercept) x
-0.1936347 0.3550081

Random effects:
Formula: ~1 | grp
(Intercept) Residual
StdDev: 0.131666 0.9365614

Number of Observations: 100
Number of Groups: 2

关于r - 在函数中创建 lme 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31788607/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com