1

数式の相互作用で遊んでいます。2つのダミー変数のうちの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

言い換えると、関数がシリンダーと(gear == 4)ダミーの間の相互作用をその場で定義することを完全に処理できないznameため、正しく設定されていない内部変数です。Design

ただし、これは機能します。

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