Rが回帰の参照として指定された因子レベルを使用するように強制する方法は?


112

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

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

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

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


9
モデル式/フィッティングの外でデータ処理ステップを実行する必要があります。から因子を作成する場合、bを使用してレベルの順序を指定できますfactor(b, levels = c(3,1,2,4,5))lm()ただし、呼び出しの外のデータ処理ステップでこれを行います。以下の私の答えはrelevel()関数を使用しているので、因子を作成してから、必要に応じて基準レベルをシフトすることができます。
Gavin Simpson、

1
あなたの質問を書き直しました。あなたは実際に参照レベルを変更した後であり、それを除外していません。
Joris Meys

私の質問を言い換えるthx。実際、relevel()は私が探していたものです。詳細な回答と例についてはThxをご覧ください。これはダミーの説明を使用するあらゆる種類の回帰に当てはまるため、線形回帰タグが少し誤解を招くかどうかは
わかりませ

回答:


152

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)

次に、関数を使用して係数bを変更します。DFrelevel()

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

9
元の変数を保持するにはwithin、を使用しないでくださいdf$bR = relevel(df$b, ref=3)
BurninLeo

1
数式内でrelevel()を使用できますが、元のデータセットには影響しません...
Mehdi Zare

36

他の人はrelevel、データのすべての分析の基本レベルを変更したい場合(またはデータの変更に乗り気な場合)に最適なソリューションであるコマンドについて言及しました。

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

例えば:

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

33

このrelevel()コマンドは、質問の省略形です。それが行うことは、参照レベルが最初になるように係数を並べ替えることです。したがって、因子レベルの並べ替えも同じ効果がありますが、より詳細に制御できます。おそらく、レベル3、4、0、1、2が必要でした。その場合...

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

参照が何であるかだけでなく、他の値の位置も(その結果を確認する必要があるのではなく)コードで簡単に確認できるため、この方法を使用します。

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


2
多項式の対比ではなく、多項式の対比。
ハドリー

後続のrelevelの呼び出しではなく、因子を定義すると同時に参照レベルを設定する方法はありますか?
David Bruce Borenstein

31

これは古い質問であることは承知していますが、同様の問題があり、次のことがわかりました。

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

あなたが尋ねたことを正確に行います。


3
これは大きな助けでした!lm()コマンド内でそれを行う方法を含む唯一のソリューションは、まさに私が必要としていたものでした。ありがとう!
cparmstrong

3
これは、要素を操作する非常に柔軟な方法です。I私はとそれを組み合わせることができるという事実のようにas.factor()、必要に応じて使用することにより、例えば、...+relevel(as.factor(mycol), ref = "myref")+...
ピーター・

12

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

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

1

dplyr / tidyverseバージョンをお探しの方。Gavin Simpsonソリューションの構築:

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

# Change reference level
DF = DF %>% mutate(b = relevel(b, 3))

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

「変数が因子の場合」をどこに置いたのか混乱しています。使用するかどうかに関係なくrelevel()、これは必要ですforcats::fct_relevel()
グレゴールトーマス

あなたは正しいです、ありがとう!afaik、fct_relevelはファクターでのみ機能するため、「使用することもできます」を追加しました。
Gorka

2
relevelファクターでのみ機能します。fct_relevelファクターでのみ機能します。AFAIKという名前以外は機能に違いはありません。「変数が因子である場合も使用できるfct_relevel」と言うことは、変数が因子でない場合に使用できることを意味しますがrelevel、そうではありません。
Gregor Thomas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.