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\)의 차이를 보여준다.
이 챕터의 페이크데이터 시뮬레이션은 다음과 같은 내용을 보여준다:
직접 비교와 회귀분석의 결과가 동일한지 여부를 직접적으로 확인할 수 있다.
통계적 적합의 특성을 이해할 수 있도록 한다.

Figure 7.4: Simulated-data example showing how regression on an indicator variable is the same as computing the difference in means between two groups.
References
Gelman, Hill, and Vehtari (2020, 99)는 지시변수(indicator variable)이라는 용어를 사용한다.↩︎
각 집단 간의 표본 크기가 다를 수 있어서 각 집단의 표준오차를 따로 구해서 그 차이의 표준오차를 구할 때와 회귀모델로 하나의 모델에서 잔차의 표준오차 하나를 추정할 때와 차이가 나타날 수 있다.↩︎