我使用以下代码来解决NLME包的问题:
library(nlme)
x <- rnorm(100)
z <- rep(c("a","b"),each=50)
y <- rnorm(100)
test.data <- data.frame(x,y,z)
test.fun <- function(test.dat)
{
form <- as.formula("y~x")
ran.form <- as.formula("~1|z")
modell <- lme(fixed = form, random=ran.form, data=test.dat)
pseudo.newdata <- test.dat[1,]
predict(modell, newdata= pseudo.newdata) ###THIS CAUSES THE ERROR!
}
test.fun(test.data)
Run Code Online (Sandbox Code Playgroud)
预测导致错误,我已经找到了基本上导致它的原因.
modell对象保存它的调用方式,预测似乎使用它来进行预测,但无法找到公式对象表单和ran.form因为它不会在正确的命名空间中查找它们.事实上,我可以通过这样做来避免这个问题:
attach(environment(form), warn.conflicts = FALSE)
predict(modell, newdata= pseudo.newdata)
detach()
Run Code Online (Sandbox Code Playgroud)
然而,我的长期目标是将modell保存到磁盘并在以后使用它们.我想我也可以尝试保存公式对象,但这对我来说是一种非常烦人和麻烦的方法来处理这个问题.
我使用自动生成的公式对象而不是明确地将它们写下来,因为我在一个批处理过程中创建了许多具有不同定义的模型,所以我无法避免它们.因此,我理想的解决方案是创建lme对象的方法,以便我可以忘记之后的公式对象并预测"正常工作".谢谢你的帮助.
尝试更换lme(arg1, arg2, arg3)用do.call(lme, list(arg1, arg2, arg3)).
library(nlme)
x <- rnorm(100)
z <- rep(c("a","b"),each=50)
y <- rnorm(100)
test.data <- data.frame(x,y,z)
test.fun <- function(test.dat)
{
form <- as.formula("y~x")
ran.form <- as.formula("~1|z")
## JUST NEED TO CHANGE THE FOLLOWING LINE
## modell <- lme(fixed = form, random=ran.form, data=test.dat)
modell <- do.call(lme, list(fixed=form, random=ran.form, data=test.data))
pseudo.newdata <- test.dat[1,]
predict(modell, newdata= pseudo.newdata) ###THIS CAUSES THE ERROR!
}
test.fun(test.data)
# a
# 0.07547742
# attr(,"label")
# [1] "Predicted values"
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为在评估对它构造的调用之前do.call(),在调用框架中计算其参数列表.要查看为什么有帮助,请键入,然后运行您的代码和我的代码,比较弹出到浏览器时打印的调试消息.lme()debug(predict)