[英]How to run effect plot inside of a R function
更新:以前的标题Is there any specific way to pass data frame as an argument to a function?
但根据这里的杰出人士的说法,这不是正确的问题。 原帖如下。
当我使用somefunc(sleepstudy)
运行以下函数时,
somefunc<-function (dataLme)
{
library(effects)
library(lme4)
fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), dataLme,
REML = 0, verbose = TRUE)
plot(effect("Days",fm8))
}
我收到了一个错误。
Error in plot(effect("Days", fm8)) :
error in evaluating the argument 'x' in selecting a method for function 'plot': Error in is.data.frame(data) : object 'dataLme' not found
但如果我手动执行
library(effects)
library(lme4)
fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), sleepstudy,
REML = 0, verbose = TRUE)
plot(effect("Days",fm8))
我没有得到任何错误。
我认为R通过值传递意味着将整个对象内容复制到函数参数。 但看起来我并不完全正确。 谁能解释一下发生了什么?
(hacky)解决方法是将dataLme
分配到全局环境中,其中effect()
将能够找到它:
library(effects)
library(lme4)
somefunc <- function (dataLme) {
## Assign to a symbol that's unlikely to be in use in .GlobalEnv
## (and make sure this function cleans up after itself!)
assign(".TeMpVaR", dataLme, envir=globalenv())
on.exit(rm(.TeMpVaR, envir=globalenv()))
fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), .TeMpVaR,
REML = 0, verbose = TRUE)
plot(effect("Days",fm8))
}
somefunc(sleepstudy)
这只是部分答案,但我确实想记录我的测试程序。 我主要想表明问题特别是effects
包而不是lme4
包(我维护它,并且遇到了这些问题:大多数这样的问题在lme4
的开发版本中得到lme4
,但有些坚持稳定版,在我的系统上安装为lme4.0
......)
library("effects")
showpkgs <- function() names(sessionInfo()$otherPkgs)
somefunc<-function (dataLme, pkg="nlme") {
require(pkg,character.only=TRUE)
on.exit(detach(paste("package",pkg,sep=":"),unload=TRUE,character.only=TRUE))
if (pkg=="nlme") {
fm8 <- lme(Reaction ~ 1 + Days,random=~Days|Subject, dataLme)
} else {
fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), dataLme, REML = 0)
}
plot(effect("Days",fm8))
}
无论我们使用稳定的lme4
,开发lme4
还是旧的nlme
软件包, lme4
出现错误
data("sleepstudy",package="lme4")
showpkgs()
somefunc(sleepstudy) ## nlme
showpkgs() ## warning about unloading nlme namespace due to glmmADMB dep. (??)
somefunc(sleepstudy,pkg="lme4.0") ## lme4-stable
showpkgs() ## failure to remove Matrix/warning message
somefunc(sleepstudy,pkg="lme4") ## lme4-devel
showpkgs() ## leaves RcppEigen, Rcpp loaded as well
我看了一下effects
包,一个简单的通用修复并不是很明显。 将相关的eval(cl)
行更改为eval(cl,envir=environment(formula(mod)))
适用于开发 lme4
,但不适用于稳定的lme4
或nlme
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.