gpt4 book ai didi

r - lme 模型的用户定义函数适合 : error

转载 作者:行者123 更新时间:2023-12-01 13:41:36 26 4
gpt4 key购买 nike

我开始用 nlme 编写一个构建线性混合模型的函数。我遇到错误:Error in eval(expr, envir, enclos) : object 'value' not found,我认为这是由于 R 不知道在哪里可以找到数据帧变量(例如, )。如果这实际上是错误发生的原因,我如何告诉函数 valuetimepoint 属于 Dat 中的变量在下面的(可重现的)代码中?

require(nlme)
Dat <- data.frame(
id = sample(10:19),
Time = sample(c("one", "two"), 10, replace = T),
Value = sample(1:10)
)
nlme_rct_lmm <- function (data, value, timepoint,
ID) {

#base_level intercept only model
bl_int_only <- gls(value ~ 1,
data = data,
method = "ML",
na.action="na.omit")
#vary intercept across participants
randomIntercept <- lme(value ~ 1,
data = data,
random = ~1|ID,
method = "ML",
na.action = "na.omit")
#add timepoint as a fixed effect
timeFE <- lme(value ~ timepoint,
data = data,
random = ~1|ID,
method = "ML",
na.action = "na.omit")
}
nlme_rct_lmm(Dat, Value, Time, id)

最佳答案

这不是(如你我所料)不同框架内的评估问题;相反,这是公式和数据之间变量名称之间的一致性问题。 R 区分大小写,因此使用 valueValueidID 等很重要。 . 此外,公式解释使用非标准评估 (NSE),因此如果您有一个变量 value 等于符号 Valuevalue ~ 1 不会神奇地转化为Value ~ 1。我在下面概述的内容通过将响应、时间和 ID 变量的名称 传递给函数来工作,因为这是最简单的方法。如果您使用非标准评估,它对最终用户来说会更优雅一些,但编程会有点困难(因此理解、调试等)。

在 easy/boneheaded 方法下面,我还讨论了如何实现 NSE 方法(一直向下滚动...)

请注意,您的示例不会返回任何内容;对于 R,这意味着当它完成函数时,所有结果都将被丢弃。您可能希望将结果作为列表返回(或者您的实际函数可能会对拟合模型做一些其他事情,例如一系列模型测试,并将这些答案作为结果返回......)

require(nlme)

Dat <- data.frame(
ID = sample(10:19),
Time = sample(c("one", "two"), 10, replace = T),
Value = sample(1:10)
)

nlme_rct_lmm <- function (data, value, timepoint,
ID) {

nullmodel <- reformulate("1",response=value)
fullmodel <- reformulate(c("1",timepoint),response=value)
remodel <- reformulate(paste("1",ID,sep="|"))

#base_level intercept only model
bl_int_only <- gls(nullmodel,
data = data,
method = "ML",
na.action="na.omit")

#vary intercept across participants
randomIntercept <- lme(nullmodel,
data = data,
random = remodel,
method = "ML",
na.action = "na.omit")

#add timepoint as a fixed effect
timeFE <- lme(fullmodel,
data = data,
random = remodel,
method = "ML",
na.action = "na.omit")
}

nlme_rct_lmm(Dat, "Value", "Time", "ID")

如果你想要更优雅的东西(但内部晦涩难懂),你可以用下面几行来定义模型。内部 substitute() 调用检索作为参数传递给函数的符号;外部 substitute() 调用将这些符号插入到公式中。

nullmodel <- formula(substitute(v~1,list(v=substitute(value))))
fullmodel <- formula(substitute(v~t,list(v=substitute(value),
t=substitute(timepoint))))
remodel <- formula(substitute(~1|i,list(i=substitute(ID))))

现在这可以工作了,无需像您预期的那样将变量指定为字符串:nlme_rct_lmm(Dat, Value, Time, ID)

关于r - lme 模型的用户定义函数适合 : error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39797361/

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