web-dev-qa-db-ja.com

Rに指定された因子レベルを回帰の参照として使用させるにはどうすればよいですか?

回帰でバイナリ説明変数を使用する場合、Rに特定のレベルを参照として使用するように指示するにはどうすればよいですか?

デフォルトでは、あるレベルを使用しているだけです。

lm(x ~ y + as.factor(b)) 

b {0, 1, 2, 3, 4}で。 Rが使用するゼロの代わりに3を使用するとします。

96
Matt Bannert

relevel()関数を参照してください。以下に例を示します。

set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))
head(DF)
str(DF)

m1 <- lm(y ~ x + b, data = DF)
summary(m1)

relevel()関数を使用して、b内の因子DFを変更します。

DF <- within(DF, b <- relevel(b, ref = 3))
m2 <- lm(y ~ x + b, data = DF)
summary(m2)

モデルは異なる基準レベルを推定しています。

> coef(m1)
(Intercept)           x          b2          b3          b4          b5 
  3.2903239   1.4358520   0.6296896   0.3698343   1.0357633   0.4666219 
> coef(m2)
(Intercept)           x          b1          b2          b4          b5 
 3.66015826  1.43585196 -0.36983433  0.25985529  0.66592898  0.09678759
134
Gavin Simpson

データに関するすべての分析のベースレベルを変更する場合(またはデータを変更しても問題ない場合)に最適なソリューションであるrelevelコマンドに言及している人もいます。

データを変更したくない場合(これは1回限りの変更ですが、将来的にはデフォルトの動作に戻りたい場合)、C(大文字に注意)関数の組み合わせを使用して設定できますコントラストと、ベースレベルにしたいレベルを選択するためのベース引数を持つcontr.treatments関数。

例えば:

lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )
33
Greg Snow

relevel()コマンドは、あなたの質問に対する簡単な方法です。参照レベルが何でも最初になるように、因子を並べ替えます。したがって、因子レベルの順序を変更しても同じ効果がありますが、より細かく制御できます。おそらく、レベル3,4,0,1,2が必要でした。その場合...

bFactor <- factor(b, levels = c(3,4,0,1,2))

参照が何であったかだけでなく、他の値の位置もコード内で見やすい(そのための結果を見なくても)ため、この方法が好きです。

注:順序付けられた要素にしないでください。指定された順序の因子と順序付けられた因子は同じものではありません。 lm()は、そうすると多項式の対比が必要だと考えるようになります。

28
John

私はこれが古い質問であることを知っていますが、私は同様の問題を抱えていて、それを発見しました:

lm(x ~ y + relevel(b, ref = "3")) 

まさにあなたが尋ねたことをします。

24
Yan Alperovych

手動で列にcontrasts属性をタグ付けすることもできますが、これは回帰関数によって尊重されているようです。

contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
   base=which(levels(df$factorcol) == 'RefLevel'))
11
Harlan