效果的功能因xlevels而失败

问题描述 投票:1回答:1

我正在开发一个函数,在R中使用effects包。我经常遇到问题,我无法调试。

我运行以下代码:

rm(list = ls())  # clear working directory
library(effects)

head(mtcars)
mod <- lm(mpg ~ gear*cyl + gear + cyl + carb, data=mtcars)
summary(mod)

eff.dat <- effect("gear*cyl", mod=mod, KR=TRUE, xlevels=list(gear=seq(3,5,1)))
eff.dat <- as.data.frame(eff.dat)
View(eff.dat)

它就像一个魅力,当mpg等于gear3, 4,以及5的相应值时,我得到cyl上的交互项的效果。

但是,一旦我把它放入一个像这样的函数:

proba <- function(term, model, main) {

    eff.dat2 <<- effect(term, mod=model, KR=TRUE,
                     xlevels=list(main=seq(min(mtcars[[main]]),
                                           max(mtcars[[main]]), 1)))
    eff.dat2 <<- as.data.frame(eff.dat2)
}

proba("gear*cyl", model=mod, main="gear")

View(eff.dat2)

xlevels部分失败,交互项估计为gear的默认值,而不是我指定的值。显然,这是一个更大的功能的一部分,否则我不打算只为effect写一些东西。

谢谢你的帮助!

r
1个回答
1
投票

首先说明会发生什么:

foo <- function(x) {
  list(x = x)
}

foo("bar")
#$x
#[1] "bar 

请注意list元素如何命名为xsetNames可用于以编程方式设置名称:

foo <- function(x) {
  setNames(list(x), x)
}

foo("bar")
#$bar
#[1] "bar"

此外,您应该避免使用<<-创建功能副作用。这是非常糟糕的做法。改为创建一个合适的返回值:

proba <- function(term, model, main) {
  as.data.frame(
    effect(term, mod=model, KR=TRUE,
           xlevels= setNames(list(seq(min(mtcars[[main]]),
                                      max(mtcars[[main]]), 1)), main))
  )
}

eff.dat2 <- proba("gear*cyl", model=mod, main="gear")
all.equal(eff.dat, eff.dat2)
#[1] TRUE
© www.soinside.com 2019 - 2024. All rights reserved.