rms-package中的交互线性回归失败

时间:2012-05-12 09:10:03

标签: r linear-regression

我正在玩配方中的互动。我想知道是否可以对两个虚拟变量之一进行交互回归。这似乎适用于使用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使用的相同拟合程序”

1 个答案:

答案 0 :(得分:2)

我不确切知道,但它与公式的评估方式有关,而不是与模型翻译后的拟合方式有关。使用traceback()表示问题发生在Design(eval.parent(m))内;使用options(error=recover)可以让您看到

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

换句话说,zname是一些未设置正确的内部变量,因为Design函数无法完全处理定义柱面和(齿轮== 4)虚拟对象之间的交互在飞行中。

但这有效:

mtcars$cylgr <- with(mtcars,interaction(cyl,gear == "4"))
regular_ols <- ols(mpg ~ wt + cyl + gear + cylgr, data=mtcars)