3

R中的效果包可以用于绘制不包括截距的线性模型的(边际)效果吗?

这是我为此类模型尝试的一些 R 代码:

x <- seq(1,100,by=0.1)
y <- 1 + 2*x + rnorm(n=length(x))

model <- lm(y ~ 0 + x)

require(effects)
plot(allEffects(model))

它产生的错误如下:

Error in plot(allEffects(model)) : 
error in evaluating the argument 'x' in selecting a method for function 'plot': 
Error in   mod.matrix %*% mod$coefficients[!is.na(mod$coefficients)] : 
non-conformable arguments

如果有人对如何克服此错误有任何想法,请告诉我。

谢谢,

伊莎贝拉

4

1 回答 1

3

代码中确实似乎存在错误。特别是,通过调度,allEffects代码调用effectwhich 调用Effect.lm. 这个特别的也被重新创建

Effect.lm("x", mod=model)
# Error in mod.matrix %*% mod$coefficients[!is.na(mod$coefficients)] : 
#   non-conformable arguments

错误似乎来自此函数主体的第 30 行

body(effects:::Effect.lm)[[30]]
# mod.matrix <- mod.matrix[, !is.na(mod$coefficients)]

当您只有 1 个非 NA 系数时会出现问题(就像您使用单个回归器且没有截距一样)。问题是,当您在单个列上执行此子集时,结果会自动不强制转换为向量而不是矩阵。我们可以创建自己的函数版本来解决这个问题

my.Effect.lm<-effects:::Effect.lm
body(my.Effect.lm)[[30]] <- quote(mod.matrix <- mod.matrix[, !is.na(mod$coefficients), drop=FALSE])
environment(my.Effect.lm) <- asNamespace("effects")

然后

model <- lm(y ~ 0 + x)
plot(my.Effect.lm("x", model))

应该管用。我必须承认我还没弄清楚怎么去allEffects上班。我不记得在解析不同命名空间中的函数时如何更改 S3 调度的工作方式。似乎没有任何简单的方法来修复实际位于effects命名空间中的函数。

因此,一般来说,只要您有多个回归量,该函数就应该在没有截距的情况下工作。您可能需要联系包作者以报告此问题。

于 2014-09-13T06:54:16.580 回答