시뮬레이션 된 데이터에 대해 몇 가지 실험을 수행하여 어떤 방법이 가장 효과적인지 확인했습니다. 아래 결과를 읽으십시오.
두 가지 시나리오를 살펴 보겠습니다. 첫째는 DUI와 주류 판매점간에 직접적인 관계가없는 곳이고 두 번째 시나리오는 직접적인 관계가있는 곳입니다. 그런 다음 각 방법을 조사하여 어떤 방법이 가장 효과적인지 확인하십시오.
사례 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_Store는 매우 중요합니다. 관계는 간접적이지만
## 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_Store는 중요하지 않으며 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 : 인구 및 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- 값을 생성합니다.