12

このソリューションのより倹約的なバージョンを作成しようとしています。これには、式の RHS を形式で指定する必要がありd1 + d1:d2ます。

数式のコンテキストでは、完全な相互作用 (つまり、を与える)*の簡潔な代役であることを考えると、私のアプローチは、代替演算子を試して定義することでした。たとえば、他のアプリケーションで慣れてきた中置アプローチを使用して、ラ:d1 * d2d1 + d2 + d1:d2%+:%

"%+:%" <- function(d1,d2) d1 + d2 + d1:d2

ただし、評価に注意を払っていないため、これは予想どおり失敗します。私の進歩を説明するために例を紹介しましょう:

set.seed(1029)
v1 <- runif(1000)
v2 <- runif(1000)
y <- .8*(v1 < .3) + .2 * (v2 > .25 & v2 < .8) - 
  .4 * (v2 > .8) + .1 * (v1 > .3 & v2 > .8)

この例で、2 つの用語を単純に書き出すことが望ましくない理由が明確になることを願っています。

y ~ cut(v2, breaks = c(0, .25, .8, 1)) +
  cut(v2, breaks = c(0, .25, .8, 1)):I(v1 < .3)

目的の出力に近い回避策の 1 つは、式全体を関数として定義することです。

plus.times <- function(outvar, d1, d2){
  as.formula(paste0(quote(outvar), "~", quote(d1),
                    "+", quote(d1), ":", quote(d2)))
}

これは、 に渡されたときに予想される係数を与えますが、lm直接解釈するのが難しい名前が付いています (特に、この一般的な例とは対照的に、注意を払って説明的な名前を付ける実際のデータでは) d1:d2

out1 <- lm(y ~ cut(v2, breaks = c(0, .25, .8, 1)) +
             cut(v2, breaks = c(0, .25, .8, 1)):I(v1 < .3))
out2 <- lm(plus.times(y, cut(v2, breaks = c(0, .25, .8, 1)), I(v1 < .3)))
any(out1$coefficients != out2$coefficients)
# [1] FALSE
names(out2$coefficients)
# [1] "(Intercept)"         "d1(0.25,0.8]"        "d1(0.8,1]"           "d1(0,0.25]:d2TRUE"  
# [5] "d1(0.25,0.8]:d2TRUE" "d1(0.8,1]:d2TRUE"

したがって、これは最適とは言えません。

上記の中置演算子が期待どおりに機能するように、コードの調整を定義する方法はありますか? plus.times変数の名前が変更されないようにの形式を変更するのはどうですか?

( ?formula?"~"?":"この回答など) を調べてきましたが、式で R が検出されたときに R がどのように解釈するかを正確に確認していないgetAnywhere(formula.default)ため、必要な微調整を行うことができます。*

4

1 に答える 1

11

この場合、新しい演算子を定義する必要はありません: in a formulad1/d2は に展開されd1 + d1:d2ます。つまり、が 内にネストさd1/d2れていることを指定します。あなたの例を続ける:d2d1

out3 <- lm(y ~ cut(v2,breaks=c(0,.25,.8,1))/I(v1 < .3))
all.equal(coef(out1), coef(out3))
# [1] TRUE

その他のコメント

因子は交差またはネストすることができます。2 つの因子のレベルのすべての組み合わせ (性別と治療、温度と pH など) を観察できる場合、2 つの因子は交差しています。因子の各レベルがいずれかのレベル内でのみ観察できる場合、因子は別の因子内にネストされています。町や国、スタッフや店などの他の要因の

これらの関係は、モデルのパラメーター化に反映されます。交差因子の場合、d1*d2またはを使用d1 + d2 + d1:d2して、各因子の主効果と交互作用を求めます。ネストされた因子の場合d1/d2、 またはを使用して、 の各レベルのd1 + d1:d2フォームの個別のサブモデルを提供します。1 + d2d1

入れ子の考え方は要因に限定されません。たとえば、男性と女性sex/xに個別の線形回帰を当てはめるために使用することがあります。x

数式で%in%は、 は と同等です:が、データ/モデルのネスト構造または階層構造を強調するために使用できます。たとえば、a + b %in% aは と同じですがa + a:b、「a 内の a プラス b」と読むと、適合するモデルをより適切に説明できます。それでも、 を使用/すると、構造を強調すると同時にモデル式を単純化できるという利点があります。

于 2015-09-20T18:29:17.940 に答える