Rの線形回帰のためにいくつかの治療と対照群をダミーコーディングするときにダミー変数トラップを回避する方法

マックス

ダミー変数の総数よりも少ないダミー変数が1つ必要であることを理解しています。ただし、Rでlmを実行すると、「特異点のために1が定義されていません」というエラーが表示され続けるため、スタックします。同様の質問がここにあります。このエラーの原因は何ですか。特異点のために係数は定義されていませんが、私の問題とは少し異なります。

私は2つの治療法(1)「利益」と(2)「歴史」を持っています。それぞれ2つのレベル(1)「低」と「高」と(2)「短い」と「長い」、つまり4つの組み合わせです。さらに、私にはコントロールグループがありますが、どちらにもさらされていませんでした。したがって、4つのダミー変数(グループの総数n = 5より1つ少ない)をコーディングしました。続いて、ダミーのコード化されたデータは次のようになります。

                               low benefit  high benefit  short history  long history
Control group                           0             o              0             0
low benefit, short history              1             0              1             0
low benefit, long history               1             0              0             1
high benefit, short history             0             1              1             0
high benefit, long history              0             1              0             1

lmを実行すると、次のようになります。

Model: 
summary(lm(X ~ short history + high benefit + long history + low benefit + Control variables, data = df))

Coefficients: (1 not defined because of singularities)
                                         Estimate   Std. Error  t value  Pr(>|t|)
(Intercept)                           5.505398100  0.963932438  5.71139  4.8663e-08 ***
Dummy short history                   0.939025772  0.379091565  2.47704   0.0142196 *
Dummy high benefit                   -0.759944023  0.288192645 -2.63693   0.0091367 **
Dummy long history                    0.759352915  0.389085599  1.95163   0.0526152 .
Dummy low benefit                              NA           NA       NA          NA
Control Varibales                          xxx          xxx        xxx       xxx

このエラーは、4番目の位置にあるダミーバリバールで常に発生します。制御変数はすべて問題なく計算されます。

私はすでに、コーディングした「履歴」を意味する2つの変数、「長い」を表す1、「短い」を表す0、「利益」を表す1、「高い」を表す1、「低い」を表す0の2つの変数のみを含めようとしました。このように、lmは機能しましたが、問題は、コントロールグループと「短い履歴、低い利益」の組み合わせが同じようにコーディングされていることです。つまり、両方の変数が0と0です。

これが基本的な間違いである場合は申し訳ありませんが、私はそれを理解することができませんでした。さらに詳しい情報が必要な場合は、そのように言ってください。前もって感謝します。

チャックP

コメントに書いたように、変数は2つしかないので、それらを因数分解してコントラストr確認すると、正しいことがわかります。http://www.sthda.com/english/articles/40-regression-analysis/163-regression-with-categorical-variables-dummy-coding-essentials-in-r/も参照してください。

あなたのデータを代表するものを作りましょう。

set.seed(2020)
df <- data.frame(
  X = runif(n = 120, min = 5, max = 15),
  benefit = rep(c("control", "low", "high"), 40),
  history = c(rep("control", 40), rep("long", 40), rep("short", 40))
)

作成benefithistory要因、コントロールがそれぞれの基本コントラストであることを確認します。

df$benefit <- factor(df$benefit)
df$history <- factor(df$history)
contrasts(df$benefit)
#>         high low
#> control    0   0
#> high       1   0
#> low        0   1
contrasts(df$history)
#>         long short
#> control    0     0
#> long       1     0
#> short      0     1

回帰を実行し、要約を取得します。4係数はすべて制御/制御と比較されます。

lm(X ~ benefit + history, df)
#> 
#> Call:
#> lm(formula = X ~ benefit + history, data = df)
#> 
#> Coefficients:
#>  (Intercept)   benefithigh    benefitlow   historylong  historyshort  
#>      9.94474      -0.08721       0.11245       0.37021      -0.35675
summary(lm(X ~ benefit + history, df))
#> 
#> Call:
#> lm(formula = X ~ benefit + history, data = df)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -5.4059 -2.3706 -0.0007  2.4986  4.7669 
#> 
#> Coefficients:
#>              Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)   9.94474    0.56786  17.513   <2e-16 ***
#> benefithigh  -0.08721    0.62842  -0.139    0.890    
#> benefitlow    0.11245    0.62842   0.179    0.858    
#> historylong   0.37021    0.62842   0.589    0.557    
#> historyshort -0.35675    0.62842  -0.568    0.571    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 2.809 on 115 degrees of freedom
#> Multiple R-squared:  0.01253,    Adjusted R-squared:  -0.02182 
#> F-statistic: 0.3648 on 4 and 115 DF,  p-value: 0.8333

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ