繁体   English   中英

在 function 内部使用效果 package

[英]Using effects package inside a function

我有一个很大的框架,里面有很多变量,我将以同样的方式进行分析。 具体来说,我想 plot 影响混合效应 model 中的置信区间。 我想编写 function 来为一个因变量定制 plot 。 直接应用 effect() function 顺利。 但是 function 中的相同代码会导致错误。

我尝试了 function 的两种变体。 两者都会导致错误。

这是我的可重现示例:

library(nlme)
library(effects)

df <- data.frame(y = rnorm(90), x = gl(3, 30), b = factor(rep(1:30, 3)))

fit <- lme(fixed = y ~ x, random = ~ 1 | b, data = df, method = "REML")
ef <- effect("x", fit)
bp <- barplot(as.vector(ef$fit), col = c("tomato", "skyblue", "limegreen"), 
        ylim = c(min(ef$lower), max(ef$upper) + (max(ef$upper) - min(ef$lower)) * 0.2 ))
arrows(x0 = bp, y0 = ef$lower, y1 = ef$upper, code = 3, angle = 90)

test1 <- function(y, x, b)
{
  fit <- lme(fixed = y ~ x, random = ~ 1 | b, method = "REML")
  ef <- effect("x", fit)
  bp <- barplot(as.vector(ef$fit), col = c("tomato", "skyblue", "limegreen"), 
                ylim = c(min(ef$lower), max(ef$upper) + (max(ef$upper) - min(ef$lower)) * 0.2 ))
  arrows(x0 = bp, y0 = ef$lower, y1 = ef$upper, code = 3, angle = 90)
}

test1(df$y, df$x, df$b)
# Error in eval(predvars, data, env) : object 'y' not found 

test2 <- function(y, x, b)
{
  frame <- data.frame(y, x, b)

  fit <- lme(fixed = y ~ x, random = ~ 1 | b, frame, method = "REML")
  ef <- effect("x", fit)
  bp <- barplot(as.vector(ef$fit), col = c("tomato", "skyblue", "limegreen"), 
                ylim = c(min(ef$lower), max(ef$upper) + (max(ef$upper) - min(ef$lower)) * 0.2 ))
  arrows(x0 = bp, y0 = ef$lower, y1 = ef$upper, code = 3, angle = 90)
}

test2(df$y, df$x, df$b)
# Error in as.data.frame.default(data, optional = TRUE) : 
#  cannot coerce class ‘"function"’ to a data.frame 

更简单:

function(df) {
  fit <- lme(fixed = y ~ x, random = ~ 1 | b, data = df, method = "REML")
  ef <- effect("x", fit)
  bp <- barplot(as.vector(ef$fit), col = c("tomato", "skyblue", "limegreen"),
                ylim = c(min(ef$lower), 
                         max(ef$upper) + (max(ef$upper) - min(ef$lower)) * 0.2 ))
  arrows(x0 = bp, y0 = ef$lower, y1 = ef$upper, code = 3, angle = 90)
}

您需要将data传递给lme ,该公式实际上并没有传递任何数据。

也就是说,您的test2应该可以工作。 我可以复制你的错误,但这真的很奇怪。 不知何故,代码在全局环境中有效,但在闭包中无效。 非常令人惊讶。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM