1

我正在玩公式中的交互。我想知道是否可以对两个虚拟变量之一进行交互回归。这似乎适用于使用 lm() 函数的常规线性回归,但使用 rms 包中的 ols() 函数,相同的公式会失败。有谁知道为什么?

这是我的例子

data(mtcars)

mtcars$gear <- factor(mtcars$gear)
regular_lm <- lm(mpg ~ wt + cyl + gear + cyl:gear, data=mtcars)
summary(regular_lm)

regular_lm <- lm(mpg ~ wt + cyl + gear + cyl:I(gear == "4"), data=mtcars)
summary(regular_lm)

现在是 rms 示例

library(rms)

dd <- datadist(mtcars)
options(datadist = "dd")

regular_ols <- ols(mpg ~ wt + cyl + gear + cyl:gear, data=mtcars)
regular_ols

# Fails with:
#     Error in if (!length(fname) || !any(fname == zname)) { : 
#         missing value where TRUE/FALSE needed
regular_ols <- ols(mpg ~ wt + cyl + gear + cyl:I(gear == "4"), data=mtcars)

这个实验可能不是最明智的统计数据,因为估计值似乎发生了显着变化,但我有点好奇为什么 ols() 会失败,因为它应该执行“lm 使用的相同拟合例程”

4

1 回答 1

2

我不确切知道,但这与计算公式的方式有关,而不是与模型翻译后的拟合方式有关。使用traceback()表明问题发生在Design(eval.parent(m)); 使用options(error=recover)可以让你看到你可以看到的地步

Browse[1]> fname
[1] "wt"   "cyl"  "gear"
Browse[1]> zname
[1] NA

换句话说,zname是一些尚未正确设置的内部变量,因为该Design函数无法完全处理定义圆柱体和 (gear==4) 虚拟对象之间的相互作用。

这虽然有效:

mtcars$cylgr <- with(mtcars,interaction(cyl,gear == "4"))
regular_ols <- ols(mpg ~ wt + cyl + gear + cylgr, data=mtcars)
于 2012-05-12T23:20:16.580 回答