【问题标题】:Can the effects package in R be used for lm models with no intercepts?R中的效果包可以用于没有截距的lm模型吗?
【发布时间】:2014-11-07 05:18:49
【问题描述】:

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

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

谢谢,

伊莎贝拉

【问题讨论】:

    标签: r package effects intercept marginal-effects


    【解决方案1】:

    代码中确实存在错误。特别是,通过调度,allEffects 代码调用effect,后者调用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 命名空间中的函数。

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

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      相关资源
      最近更新 更多