gpt4 book ai didi

r - 如何在函数内部使用 lmer

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

我正在尝试编写一个函数来收集我在脚本中经常使用的一些调用
我在我的例子中使用了 lme4 包的 sleepstudy 数据
这是我开始使用的功能(的简化版本):

trimModel1 <- function(frm, df) {
require(LMERConvenienceFunctions)
require(lme4)

lm<-lmer(frm,data=df)
lm.trimmed = romr.fnc(lm, df)
df = lm.trimmed$data
# update initial model on trimmed data
lm<-lmer(frm,data=df)
# lm@call$formula<-frm
mcp.fnc(lm)
lm
}

当我像下面这样调用这个函数时:
(fm1<-trimModel1(Reaction ~ Days + (Days|Subject),sleepstudy))

输出的前三行如下所示:
Linear mixed model fit by REML 
Formula: frm
Data: df

如果我在控制台中调用了 trimModel1 函数的命令,模型摘要的前三行如下所示:
Linear mixed model fit by REML 
Formula: Reaction ~ Days + (Days | Subject)
Data: sleepstudy

差异是一个问题,因为使用 lme4 包的几个包都使用了公式和数据字段。例如,效果包使用这些字段,当我使用上面的 trimModel1 函数时,如下所示的命令将不起作用:
library(effects)
plot(allEffects(fm1))

我在 stackoverflow 和 R 讨论组上四处寻找解决方案,发现您可以更改模型的公式字段。如果您取消注释 lm@call$formula<-frm在 trimModel1 函数中的行中,摘要中的公式字段显示正确。不幸的是,当我现在从效果包中运行一个函数时,我仍然收到错误:
Error in terms.formula(formula, data = data) : 
'data' argument is of the wrong type

这是因为数据字段仍然不正确。
我发现的另一个可能的解决方案是这个函数:
trimModel2 <- function(frm, df) {
require(LMERConvenienceFunctions)
require(lme4)

lm<-do.call("lmer",list(frm,data=df))
lm.trimmed = romr.fnc(lm, df)
df = lm.trimmed$data
# update initial model on trimmed data
lm<-do.call("lmer",list(frm,data=df))
mcp.fnc(lm)
lm
}

当我现在在控制台中键入以下命令时,我没有收到任何错误:
(fm2<-trimModel2(Reaction ~ Days + (Days|Subject),sleepstudy))
plot(allEffects(fm2))

allEffects 函数可以工作,但现在的问题是 fm2 模型的摘要显示了原始 sleepstudy 数据。这对于 sleepstudy 数据来说不是一个大问题,但是对于非常大的数据集,有时 Rstudio 在显示模型时会崩溃。
有谁知道如何使这些功能中的一个(或两个)正常工作?
我想我必须更改 fm1@call$data 字段,但我不知道如何更改。

最佳答案

像这样做:

trimModel1 <- function(frm, df) {
require(LMERConvenienceFunctions)
require(lme4)
dfname <- as.name(deparse(substitute(df)))

lm<-lmer(frm,data=df)
lm.trimmed = romr.fnc(lm, df)
df = lm.trimmed$data
# update initial model on trimmed data
lm<-lmer(frm,data=df)
lm@call$formula <- frm
lm@call$data <- dfname
mcp.fnc(lm)
lm
}

这是从对象本身获取对象名称的“解解析替换技巧”。

关于r - 如何在函数内部使用 lmer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14275664/

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