我正在开发一个函数,在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
等于gear
和3, 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
写一些东西。
谢谢你的帮助!
首先说明会发生什么:
foo <- function(x) {
list(x = x)
}
foo("bar")
#$x
#[1] "bar
请注意list元素如何命名为x
。 setNames
可用于以编程方式设置名称:
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