Chapter 7 Linear regression with a single predictor
회귀분석이란 본질적으로 주어진 설명변수들, \(x_1, x_2, \dots, x_n\)로부터 결과변수 \(y\)를 예측하는 기법이다. 이 챕터에서는 하나의 연속형 확률변수 \(x\)로 연속형 확률변수 \(y\)를 예측하는 선형모델 \(y_i = a + bx_i + \text{error}\)을 데이터 \((x_i, y_i), i=1, \cdots, n\)에 적합하는 절차에 대해서 살펴본다.
7.2 Checking the model-fitting procedure using fake-data simulation
우리가 사실이라고 알고 있는 조건들을 통제하는 상황에서 회귀모델을 수행하는 예제를 통해 적합 결과를 확인할 수 있다.
7.2.1 Step 1: Creating the pretend world
모델의 모든 파라미터에 대한 값들이 진실값(true values)이라고 가정하는 것에서 시작하자. \(y = 46.3 + 3.0x + \text{error}\)라는 관계가 참이며, 오차는 평균 0, 표준편차 3.8을 가진 정규분포를 따른다고 가정하자. 이제 모델을 통해 얻은 \(y\)의 분포가 실제 관측된 \(y\)의 분포와 일관된지를 분석할 수 있게 된다.
<- 46.3
a <- 3.0
b <- 3.8
sigma <- hibbs$growth
x <- length(x) n
7.2.2 Step 2: Simulating fake data
페이크데이터의 벡터 \(y\)를 시뮬레이션하고 데이터프레임으로 만들어 보자:
<- a + b*x + rnorm(n, 0, sigma)
y <- data.frame(x, y) fake
7.2.3 Step 3: Fitting the model and comparing fitted to assumed values
다음 단계는 데이터에 회귀모델을 적합하는 것이다. 회귀모델 적합은 \(\alpha, \beta, \sigma\)로 가정한 진실값들을 사용하지 않는다.
.4 <- lm(y ~ x, data = fake)
fit7summary(fit7.4)
##
## Call:
## lm(formula = y ~ x, data = fake)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.9143 -3.1267 0.2755 2.9873 5.3633
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 47.9112 1.6207 29.561 5.11e-14 ***
## x 2.1798 0.6958 3.133 0.00734 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.761 on 14 degrees of freedom
## Multiple R-squared: 0.4122, Adjusted R-squared: 0.3702
## F-statistic: 9.816 on 1 and 14 DF, p-value: 0.007335
추정된 계수값을 가정한 진실값, 46.3과 3.0과 비교해면, 적합된 결과가 충분히 합당하다는 것을 할 수 있다. 추정값은 정확하게 들어맞지는 않지만 오차 범위 내에 존재한다.
회귀분석 결과 객체로부터 계수값에 대한 추정값과 표준오차를 추출해서 비교해보도록 한다.
<- summary(fit7.4)$coef[2,1]
b_hat <- summary(fit7.4)$coef[2,2] b_se
모수의 진실값 \(b\)가 각각 \(\pm1\)이나 \(\pm2\)의 표준오차로 추정된 68%와 95%의 신뢰구간 내에서 얻을 수 있는지를 확인해보자 (Figure 4.1을 생각해보자):
<- abs(b - b_hat) < b_se
cover_68 <- abs(b - b_hat) < 2*b_se
cover_95 cat(paste("68% coverage: ", cover_68, "\n"))
## 68% coverage: FALSE
cat(paste("95% coverage: ", cover_95, "\n"))
## 95% coverage: TRUE
7.2.4 Step 4: Embedding the simulation in a loop
신뢰구간이 모수의 진실값을 포함하는가? 이를 확인하기 위해서 정규분포를 사용, 우리는 표집분포를 1000회의 반복문을 통해서 데이터 시뮬레이션, 모델 적합, 그리고 신뢰구간의 범주가 모집단을 포함하는지를 컴퓨팅해서 체크할 수 있다.
<- 1000
n_fake <- rep(NA, n_fake)
cover_68 <- rep(NA, n_fake)
cover_95 for (s in 1:n_fake){
<- a + b*x + rnorm(n, 0, sigma)
y <- data.frame(x, y)
fake .4 <- lm(y ~ x, data=fake)
fit7<- summary(fit7.4)$coef[2,1]
b_hat <- summary(fit7.4)$coef[2,2]
b_se <- abs(b - b_hat) < b_se
cover_68[s] <- abs(b - b_hat) < 2*b_se
cover_95[s]
}cat(paste("68% coverage: ", mean(cover_68), "\n"))
## 68% coverage: 0.628
cat(paste("95% coverage: ", mean(cover_95), "\n"))
## 95% coverage: 0.915
이 결과는 mean(cover_68) =
67%, mean(cover_95) =
92%로 각 68%, 95%에서 멀리 떨어져 있지 않다는 것을 알 수 있다. 좀 차이가 나는 이유는 표본 규모가 작기 때문이다. 표본 규모를 반영한 자유도 14의 \(t\) 분포를 고려해서 추정해보자.
<- 1000
n_fake <- rep(NA, n_fake)
cover_68 <- rep(NA, n_fake)
cover_95 <- qt(0.84, n - 2)
t_68 <- qt(0.975, n - 2)
t_95 for (s in 1:n_fake){
<- a + b*x + rnorm(n, 0, sigma)
y <- data.frame(x, y)
fake <- lm(y ~ x, data=fake)
fit <- summary(fit7.4)$coef[2,1]
b_hat <- summary(fit7.4)$coef[2,2]
b_se <- abs(b - b_hat) < t_68 * b_se
cover_68[s] <- abs(b - b_hat) < t_95 * b_se
cover_95[s]
}cat(paste("68% coverage: ", mean(cover_68), "\n"))
## 68% coverage: 1
cat(paste("95% coverage: ", mean(cover_95), "\n"))
## 95% coverage: 1
위의 시뮬레이션 결과는 95% 신뢰구간이 모수의 진리값을 포함하고 있다(TRUE
)는 결과를 반환한다.
7.3 Formulating comparisons as regression models
회귀분석으로 비교하기 위해서는 더미변수(dummy variable)15의 개념이 필요하다. 더미변수는 어떤 데이터가 특정한 카테고리에 속하냐 속하지 않느냐에 따라 1 또는 0으로 나타내는 예측변수를 의미한다.
7.3.1 Estimating the mean is the same as regressing on a constant term
평균이 2.0, 표준편차가 5.0인 모집단으로부터 20개의 관측치를 시뮬레이션해보자. 소수점 둘째자리로 반올림한 시뮬레이션 결과는 다음과 같다:
<- 20
n_0 <- rnorm(n_0, 2.0, 5.0)
y_0 <- data.frame(y_0)
fake_0 print(round(y_0, 2))
## [1] -0.43 0.27 10.66 7.22 1.14 4.33 3.74 -1.02 -5.09 -1.53 8.59 4.76
## [13] 4.33 4.57 8.41 0.37 -2.74 3.09 -2.04 -1.84
무작위 표본이라는 것을 고려하면 모집단의 평균을 mean(y_0)
, 표준오차를 sd(y_0)/sqrt(n_0)
으로 추정할 수 있다.
mean(y_0); #2.3
## [1] 2.339922
sd(y_0)/sqrt(n_0) # 1.07
## [1] 0.9617659
절편에 대한 최소자승 회귀분석을 이용하여 동일한 결과를 얻을 수도 있다.
.5 <- lm(y_0 ~ 1, data=fake_0)
fit7summary(fit7.5);sigma(fit7.5)
##
## Call:
## lm(formula = y_0 ~ 1, data = fake_0)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.4343 -3.4854 -0.2231 2.2792 8.3225
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.3399 0.9618 2.433 0.025 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.301 on 19 degrees of freedom
## [1] 4.301148
모수로서 절편이 2.0, 잔차의 표준편차인 \(\sigma\)가 5.0이라는 것을 아는 상태에서 시뮬레이션을 했지만 작은 표본 규모는 불확실한 추정값(noisy estimates)을 산출한다. 추정값 2.35\((\beta)\), 4.78\((\sigma)\)는 주어진 표준오차 하에서 모수값을 포함한다는 것을 알 수 있다.
7.3.2 Estimating a difference is the same as regressing on an indicator variable
이번에는 새로운 그룹을 추가한다. 평균 8.0, 표준편차 5.0인 모집단으로부터 30개의 관측치를 추출한 집단이다.
<- 30
n_1 <- rnorm(n_1, 8.0, 5.0) y_1
각 집단의 평균을 직접 비교하고 표준오차도 컴퓨팅 할 수 있다:
<- mean(y_1) - mean(y_0)
diff <- sd(y_0)/sqrt(n_0)
se_0 <- sd(y_1)/sqrt(n_1)
se_1 <- sqrt(se_0^2 + se_1^2) se
시뮬레이션에 있어서 두 집단의 평균 차이는 6.13, 그 평균 차이의 표준오차는 1.12이다. 이 결과는 실제 모집단에서의 평균 차이인 6.0에 근접한 것이다.
데이터로부터 \(y\)라는 하나의 벡터와 더미변수 \(x\)를 합쳐서 회귀분석 프레임으로 재구성할 수 있다. 이때, 더미변수 \(x\)는 집단 0에 관측치가 속할 경우에 0, 집단 1에 관측치가 속할 때는 1로 코딩되어 있는 변수이다.
\[ x_i = \begin{cases} 0 & \text{if observation $i$ is in group 0}\\ 1 & \text{if observation $i$ is in group 1}. \end{cases} \]
R로 나타내면:
<- n_0 + n_1
n <- c(y_0, y_1)
y <- c(rep(0, n_0), rep(1, n_1))
x <- data.frame(x, y)
fake .6 <- lm(y ~ x, data=fake)
fit7summary(fit7.6);sigma(fit7.6)
##
## Call:
## lm(formula = y ~ x, data = fake)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.4297 -3.2468 0.5283 2.3735 8.7054
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.3399 0.9687 2.415 0.019574 *
## x 5.0842 1.2506 4.065 0.000177 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.332 on 48 degrees of freedom
## Multiple R-squared: 0.2561, Adjusted R-squared: 0.2406
## F-statistic: 16.53 on 1 and 48 DF, p-value: 0.0001772
## [1] 4.332364
추정된 기울기는 6.13으로 앞에서 살펴본 \(\bar y_1 - \bar y_0\)의 차이와 동일하다. 표준오차도 거의 동일하지만 약간 다른데, 왜냐하면 두 평균 차이와 각각의 표준오차를 직접 구해서 비교할 경우 \(se_0\)과 \(se_1\)이라는 별개의 값을 활용해서 계산을 하는 반면, 회귀모델은 하나의 잔차의 표준오차 모수값을 추정하기 때문이다.16
Figure 7.4는 앞서 두 집단에 대한 추정치의 차이를 시각적으로 보여준다. 다른 예측변수들이 없을 때, 최소자승 회귀선은 \((0, \bar y_0)\)와 \((1, \bar y_1)\)의 두 점을 지난다. 회귀선의 기울기는 \(\bar y_1 - \bar_0\)의 차이를 보여준다.
이 챕터의 페이크데이터 시뮬레이션은 다음과 같은 내용을 보여준다:
직접 비교와 회귀분석의 결과가 동일한지 여부를 직접적으로 확인할 수 있다.
통계적 적합의 특성을 이해할 수 있도록 한다.
References
Gelman, Hill, and Vehtari (2020, 99)는 지시변수(indicator variable)이라는 용어를 사용한다.↩︎
각 집단 간의 표본 크기가 다를 수 있어서 각 집단의 표준오차를 따로 구해서 그 차이의 표준오차를 구할 때와 회귀모델로 하나의 모델에서 잔차의 표준오차 하나를 추정할 때와 차이가 나타날 수 있다.↩︎