多重共線性が存在する場合の線形回帰係数の統計的有意性の決定


9

人口サイズの異なる都市がたくさんあり、都市の酒屋の数とDUIの数の間に正の線形関係があるかどうかを確認したいとします。推定回帰係数のt検定に基づいて、この関係が重要であるかどうかを判断しています。

今明らかにポップ。都市のサイズは、DUIの数と酒屋の数の両方と正の相関があります。したがって、酒屋だけで単純な線形回帰を実行し、その回帰係数が統計的に有意であるかどうかを確認すると、多重共線性の問題に遭遇し、酒屋のDUIへの影響を過大評価します。

これを修正するには、どちらの方法を使用すればよいですか?

  1. 1人あたりの酒屋の値を取得して回帰するためには、市内の酒屋の数を人口で割る必要があります。

  2. 酒屋とサイズの両方に回帰し、サイズを制御するときに酒屋の係数が有意であるかどうかを確認する必要があります。

  3. 他の方法?

私は正直にどちらがより賢明に見えるかを決めることができません。私は彼らの間で動揺します、私がそれが正しい方法であると自分に納得させることができると思うものに依存します。

一方で、DUIは個人によってコミットされるため、1人あたりの酒屋は適切な変数のように見えますが、統計的に厳密ではないようです。一方、サイズの制御は統計的に厳密であるように見えますが、間接的です。さらに、1人あたりの酒類の保存量を計算した後に再スケーリングすると、2つの方法の間で非常によく似た回帰係数が得られますが、方法1ではより小さなp値が生成されます。


3
答えるべき質問は、レートをモデル化するかどうかです。これを読むと役立つかもしれません:ポアソンモデルでは、時間を共変量またはオフセットとして使用することの違いは何ですか?
ガン-モニカの回復

2
重要で適切に組み立てられた質問。
rolando2

2
@gungのリンクされた回答からこれを強調する価値があります:「カウントまたはレートをモデル化する必要があるかどうかは、実際の問題が何であるかに依存します。知りたいことに対応するものをモデル化する必要があります。」(すなわち、目標は、p値を最小化することではなく、関心の効果を評価することです)
GeoMatt22 '22

回答:


5

「一人当たりの酒屋」(X)と「人口サイズ」(Z)で「一人当たりDUI」(Y)を後退させます。このように、Yは都会の人々の飲酒運転の傾向を反映し、Xは特定の都市の人口特性です。Zは、Yにサイズの影響がある場合に備えて制御変数です。この設定で多重共線性の問題が発生することはないと思います。

βZ


3

通常の最小二乗法でモデルを推定する場合、2番目の回帰はかなり問題になります。

また、都市の規模によって誤差項の変動がどのように変化するかを検討することもできます。

回帰(2)は、観測(都市の人口の2乗で重み付けされる)と同じです(1)。

iyixini

yi=a+bxi+ϵi

niyi=ani+bnixi+ui

これは加重最小二乗法であり、適用する加重は都市の人口の二乗です。それはあなたが最大の都市に与えている重量の多くですか?

都市の各個人の観測値があり、各個人にその都市の平均値を割り当てた場合、これは、人口ごとに(都市の二乗ではなく)重み付けを行う回帰を実行することと同じになります。


1

シミュレーションデータに対していくつかの実験を行い、どの方法が最適かを確認しました。以下の調査結果をお読みください。

2つの異なるシナリオを見てみましょう。1つ目はDUIと酒屋の間に直接的な関係がない場合、もう1 は直接的な関係がある場合です。次に、各方法を調べて、どの方法が最適かを確認します。

ケース1:直接の関係はないが、どちらも人口に関連している

library(rmutil)
############
## Simulating Data

set.seed(111)  
# Simulating city populations 
popln <- rpareto(n=10000,m=10000,s=1.2)

# Simulating DUI numbers
e1 <- rnorm(10000,mean=0,sd=15)
DUI = 100 + popln * 0.04 + e1
summary(DUI)
truehist(log(DUI))

# Simulating Nbr of Liquor stores
e2 <- rnorm(100,mean=0,sd=5)
Nbr_Liquor_Stores = 20 + popln * 0.009 + e2
summary(Nbr_Liquor_Stores)
truehist(log(Nbr_Liquor_Stores))

dat <- data.frame(popln,DUI,Nbr_Liquor_Stores)

データがシミュレートされたので、各メソッドがどのように機能するかを見てみましょう。

## Method 0: Simple OLS
fit0 <- lm(DUI~Nbr_Liquor_Stores,data=dat)
summary(fit0)

Coefficients:
                   Estimate Std. Error  t value Pr(>|t|)    
(Intercept)       9.4353630  0.2801544    33.68   <2e-16 ***
Nbr_Liquor_Stores 4.4444207  0.0001609 27617.49   <2e-16 ***

予想通り、Nbr_Liquor_Storesは非常に重要です。関係は間接的ですが。

## Method 1: Divide Liquor Stores by population and then regress
fit1 <- lm( I(DUI/popln) ~ Nbr_Liquor_Stores, data=dat)
summary(fit1)

                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)        4.981e-01  4.143e-02  12.022   <2e-16 ***
Nbr_Liquor_Stores -1.325e-05  2.380e-05  -0.557    0.578    

Nbr_Liquor_Storesは重要ではありません。機能しているようですが、結論にはまだジャンプしません。

## Method 2: Divide Liquor Stores by population and then regress
fit2 <- lm( DUI ~ Nbr_Liquor_Stores + popln, data=dat)
summary(fit2)

                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)        1.003e+02  6.022e-01 166.569   <2e-16 ***
Nbr_Liquor_Stores -1.603e-02  3.042e-02  -0.527    0.598    
popln              4.014e-02  2.738e-04 146.618   <2e-16 ***

Nbr_Liquor_Storesは重要ではなく、p値もメソッド1に非常に近いです。

## Method 3: "DUI per capita" on "liquer stores per capita" and "population size" 
fit3 <- lm( I(DUI/popln) ~ I(Nbr_Liquor_Stores/popln) + popln, data=dat)
summary(fit3)

                             Estimate Std. Error t value Pr(>|t|)    
(Intercept)                 2.841e-02  1.300e-02   2.187   0.0288 *  
I(Nbr_Liquor_Stores/popln)  4.886e+00  1.603e-02 304.867   <2e-16 ***
popln                      -8.426e-09  6.675e-08  -0.126   0.8996    

(Nbr_Liquor_Stores / popln)非常に重要です!それを期待していませんでした。おそらく、この方法は問題の説明に最適ではありません。

ケース2:PopulationとNbr_Liquor_Storesの両方との直接的な関係

### Simulating Data    

set.seed(111)  
# Simulating city populations 
popln <- rpareto(n=10000,m=10000,s=1.2)

# Simulating Nbr of Liquor stores
e2 <- rnorm(100,mean=0,sd=5)
Nbr_Liquor_Stores = 20 + popln * 0.009 + e2
summary(Nbr_Liquor_Stores)
truehist(log(Nbr_Liquor_Stores))

# Simulating DUI numbers
e1 <- rnorm(10000,mean=0,sd=15)
DUI = 100 + popln * 0.021 + Nbr_Liquor_Stores * 0.01 + e1
summary(DUI)
truehist(log(DUI))

dat <- data.frame(popln,DUI,Nbr_Liquor_Stores)

このシナリオの各メソッドのパフォーマンスを見てみましょう。

## Method 0: Simple OLS
fit0 <- lm(DUI~Nbr_Liquor_Stores,data=dat)
summary(fit0)

                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)       5.244e+01  1.951e-01   268.8   <2e-16 ***
Nbr_Liquor_Stores 2.343e+00  1.121e-04 20908.9   <2e-16 ***

予想されるが、因果関係を推論するための優れた方法ではない。

## Method 1: Divide Liquor Stores by population and then regress
fit1 <- lm( I(DUI/popln) ~ Nbr_Liquor_Stores, data=dat)
summary(fit1)

                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)        4.705e-01  4.005e-02  11.747   <2e-16 ***
Nbr_Liquor_Stores -1.294e-05  2.301e-05  -0.562    0.574    

それは私にとって驚きです。この方法で関係をキャプチャすることを期待していましたが、それはうまくいきません。したがって、このシナリオではこのメソッドは失敗します。

## Method 2: Divide Liquor Stores by population and then regress
fit2 <- lm( DUI ~ Nbr_Liquor_Stores + popln, data=dat)
summary(fit2)

                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)        1.013e+02  5.945e-01 170.391   <2e-16 ***
Nbr_Liquor_Stores -5.484e-02  2.825e-02  -1.941   0.0523 .  
popln              2.158e-02  2.543e-04  84.875   <2e-16 ***

Nbr_Liquor_Storesは重要であり、p値は非常に理にかなっています。私にとって明確な勝者。

## Method 3: "DUI per capita" on "liquer stores per capita" and "population size" 
fit3 <- lm( I(DUI/popln) ~ I(Nbr_Liquor_Stores/popln) + popln, data=dat)
summary(fit3)

                             Estimate Std. Error t value Pr(>|t|)    
(Intercept)                 6.540e-02  1.485e-02   4.405 1.07e-05 ***
I(Nbr_Liquor_Stores/popln)  3.915e+00  1.553e-02 252.063  < 2e-16 ***
popln                      -2.056e-08  7.635e-08  -0.269    0.788    

TLDR; 方法2は、さまざまなシナリオで最も正確なp値を生成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.