187강이 의 문제를 다뤘습니다. 이제 오차 쪽이 문제입니다.
184강 심화 4의 가우스-마르코프가 등분산을 가정했습니다. 그것이 깨지면 어떻게 되는지가 이 강의의 물음입니다.
| 무엇이 | 어떻게 되는가 |
|---|---|
| 계수 | 여전히 불편입니다 |
| 표준오차 | 틀립니다 |
| 검정과 구간 | 그만큼 틀립니다 |
계수가 멀쩡하다는 것이 핵심입니다. 모형을 고칠 필요가 없고 표준오차만 고치면 됩니다.
그리고 널리 퍼진 오해가 하나 있습니다. "이분산이 있으면 표준오차가 작게 나온다"는 말이 절반만 맞습니다. 방향은 오차가 큰 자리가 레버리지가 큰 자리인지가 정합니다.
문제. 이분산의 영향을 잽니다.
(1) 오차의 크기를 의 거듭제곱으로 두고 재세요.
(2) 오차가 큰 자리를 바꿔 방향을 확인하세요.
생각의 실마리. 계수는 꼴이라 오차의 평균이 이면 불편입니다. 그런데 그 분산은 이라 가 자리마다 다르면 등분산 공식과 어긋납니다.
풀이. (1) 를 부터 까지 두고 오차의 sd를 로 둡니다.
| 오차 sd가 x^ | 계수의 참 표준편차 | 보통 표준오차의 평균 | 비 | 실제 오류율 |
|---|---|---|---|---|
계수 자체는 참값 둘레에 그대로 있습니다. 불편성은 안 깨집니다.
그런데 보통 표준오차가 참 표준편차보다 작아집니다. 이면 비가 이고, 를 겨냥한 오류율이 ****가 됩니다.
(2) 오차가 큰 자리를 바꿔 봅니다. 레버리지는 가 평균에서 멀수록 큽니다.
| 오차가 큰 자리 | 오차분산과 레버리지의 상관 | 계수의 참 표준편차 | 보통 표준오차 평균 | 비 |
|---|---|---|---|---|
| 가 클수록 큼 | ||||
| 가 작을수록 큼 | ||||
| 가운데가 큼 |
앞의 두 줄은 상관이 같은 입니다. 가 크든 작든 양 끝이 레버리지가 큰 자리이므로 대칭입니다.
셋째 줄만 상관이 로 음수이고, 비가 로 뒤집힙니다. 오차가 가운데에서 크면 보통 표준오차가 오히려 크게 나와 조심스러워집니다.
"이분산이 있으면 언제나 헤퍼진다"는 말은 틀립니다. 방향이 자료에 달려 있습니다.
이 문제에서 배우는 것. 이분산이 안전한 방향으로 틀릴 수도 있다는 것이 오히려 위험합니다. 어느 방향인지는 를 알아야 판정할 수 있는데, 그것을 알면 애초에 가중최소제곱을 쓰면 됩니다. 모르는 상태에서 "아마 보수적일 것"이라고 넘기면 셋째 줄 같은 자료에서만 맞고 나머지에서는 틀립니다. 179강 문제 1에서 치우친 분포의 검정이 배치에 따라 방향을 바꿨던 것과 같은 구조이며, 모르면 고쳐 두는 것이 답입니다.
바로 확인 1.
확인 1-1. 이분산에서 계수와 표준오차가 각각 어떻게 되는지 쓰세요.
답. 계수는 여전히 불편이고 표준오차만 틀립니다.
확인 1-2. 검산에서 일 때의 비와 실제 오류율을 쓰세요.
답. 과 입니다.
확인 1-3. 표준오차가 작아질지 커질지를 무엇이 정하는지 쓰세요.
답. 오차분산과 레버리지의 상관이 양수인지 음수인지가 정합니다.
문제. 강건 표준오차를 만듭니다.
(1) HC0부터 HC3까지 계산하세요.
(2) 표본 크기별로 참값과 견주세요.
(3) 실제 오류율을 재세요.
생각의 실마리. 보통 표준오차는 가운데에 를 씁니다. 가 다 다르면 그 자리에 잔차 제곱을 하나씩 넣으면 됩니다.
풀이. (1) 계산합니다.
| 무엇 | 기울기의 표준오차 | 값 | |
|---|---|---|---|
| 보통 | |||
| HC0 | |||
| HC1 | |||
| HC2 | |||
| HC3 |
계수는 로 하나뿐이고 표준오차만 여럿입니다. 값이 에서 로 네 배 차이 납니다.
| 무엇 | w_ |
|---|---|
| HC0 | e_{i}^ |
| HC1 | |
| HC2 | |
| HC3 | e_{i}^{2}/(1-h_{i})^ |
HC2와 HC3은 레버리지로 나눕니다. 184강 심화 5에서 본 대로 레버리지가 큰 자리의 잔차가 작아 보이므로, 그것을 되돌립니다.
(2) 어느 것이 실제로 맞는지 모의로 확인합니다.
| 표본 크기 | 참 표준편차 | 보통 | HC0 | HC2 | HC3 |
|---|---|---|---|---|---|
보통 표준오차는 표본이 커져도 참값에 안 붙습니다. 과 의 차이가 에서도 남으며, 틀린 값으로 수렴합니다.
HC0은 작은 표본에서 아래로 치우칩니다. 에서 대 입니다.
HC3이 네 줄 모두 참값에 가장 가깝습니다. 에서 로 참값 에 거의 붙습니다.
(3) 실제 오류율로도 봅니다.
| 표본 크기 | 보통 | HC0 | HC1 | HC3 | 목표 |
|---|---|---|---|---|---|
보통은 에서도 입니다. 표본을 늘려도 안 낫습니다.
HC3이 작은 표본에서도 목표에 가장 가깝습니다. 다만 에서 이라 아직 헤픕니다. 그럴 때는 179강의 순열이나 붓스트랩을 씁니다.
이 문제에서 배우는 것. 강건 표준오차의 "강건"이 표본이 클 때만 성립합니다. 이름이 주는 인상과 달리 작은 표본에서는 HC0이 보통보다 나쁠 수도 있으며, 에서 대 이 그 경우입니다. 그래서 실무의 권장이 HC3을 기본값으로 두는 것이고, 통계 소프트웨어의 기본이 HC1인 경우가 많은 것은 역사적 이유입니다. 이 몇백을 넘으면 넷이 거의 같아지므로 무엇을 써도 되지만, 작은 표본에서는 HC3을 명시적으로 골라야 합니다.
바로 확인 2.
확인 2-1. 강건 표준오차가 무엇을 바꾸는지 쓰세요.
답. 가운데의 자리에 잔차 제곱을 하나씩 넣습니다.
확인 2-2. 검산에서 일 때 참 표준편차와 보통 표준오차를 쓰세요.
답. 와 이며 표본이 커져도 안 붙습니다.
확인 2-3. 검산에서 일 때 네 방법의 오류율을 쓰세요.
답. , , , 입니다.
문제. 검정하고 판단합니다.
(1) 브루시-페이건 검정을 구성하세요.
(2) 검정 후 선택이 왜 나쁜지 보이세요.
(3) 등분산일 때의 손해를 재세요.
생각의 실마리. 이분산이란 오차의 크기가 로 설명된다는 뜻입니다. 그러면 잔차 제곱을 로 회귀해 보면 됩니다.
풀이. (1) 잔차 제곱을 로 회귀합니다.
| 자료 | 잔차제곱의 R^ | LM 통계량 | 값 | 기각 |
|---|---|---|---|---|
| 등분산 | 아니오 | |||
| 에 비례 | 예 | |||
| 의 제곱에 비례 | 예 | |||
| 두 덩어리 | 예 |
자유도 인 카이제곱의 꼬리 확률이 입니다. 등분산에서는 기각을 안 하고 나머지 셋에서는 기각합니다.
(2) 그런데 검정으로 방법을 고르면 안 됩니다. 178강 문제 2의 두 단계 절차 문제가 그대로입니다.
| 절차 | 이분산일 때 | 등분산일 때 | 둘 중 나쁜 쪽 | 목표 |
|---|---|---|---|---|
| 언제나 보통 | ||||
| 언제나 HC3 | ||||
| 검정하고 고름 |
브루시-페이건이 기각한 비율은 이분산에서 이고 등분산에서 입니다.
이분산에서는 검정이 거의 언제나 기각해 두 단계가 HC3과 같아집니다. 와 입니다.
등분산에서는 가끔 잘못 기각해 두 단계가 보통과 같은 에 머뭅니다.
어느 쪽에서도 두 단계가 언제나 HC3보다 낫지 않습니다. 절차만 복잡해집니다.
(3) 등분산일 때 강건 표준오차의 손해를 잽니다.
| 표본 크기 | 보통 표준오차 평균 | HC3 평균 | HC3이 몇 배 |
|---|---|---|---|
에서 퍼센트 크고 에서는 퍼센트입니다.
그 정도가 이분산일 때 얻는 것에 비해 아주 쌉니다. 문제 2에서 보통이 참값의 퍼센트였는데, 여기서 잃는 것은 퍼센트뿐입니다.
이 문제에서 배우는 것. 가정 검정의 쓸모가 방법 선택이 아니라 이해에 있습니다. 브루시-페이건이 기각했다는 사실 자체는 무엇을 할지 말해 주지 않지만, 잔차 제곱이 무엇으로 설명되는지 보면 분산 구조를 알게 되어 문제 4의 가중최소제곱을 쓸 수 있습니다. 검정을 방법 선택의 스위치로 쓰는 것과 자료를 이해하는 도구로 쓰는 것은 다르며, 이 단원과 01단원이 되풀이해 말하는 것은 앞쪽을 하지 말라는 것뿐입니다.
바로 확인 3.
확인 3-1. 브루시-페이건 검정을 한 문장으로 쓰세요.
답. 잔차 제곱을 설명변수로 회귀해 설명되는지 봅니다.
확인 3-2. 검산에서 세 절차의 나쁜 쪽 오류율을 쓰세요.
답. , , 입니다.
확인 3-3. 검산에서 등분산일 때 HC3의 손해를 쓰세요.
답. 에서 배이고 에서 배입니다.
문제. 가중최소제곱을 씁니다.
(1) 세 방법을 견주세요.
(2) 가중치를 잘못 두면 어떻게 되는지 확인하세요.
생각의 실마리. 오차가 작은 자리의 관측이 더 믿을 만합니다. 그것에 무게를 더 주면 정보를 더 씁니다. 175강의 가중치와 같은 발상이며, 거기서는 뽑힐 확률이었고 여기서는 정밀도입니다.
풀이. (1) 오차의 sd가 에 비례하는 자료입니다.
| 방법 | 기울기 | 표준오차 | 무엇을 가정 |
|---|---|---|---|
| 보통 최소제곱 | 등분산 | ||
| 최소제곱에 HC3 | 없음 | ||
| 가중최소제곱 | 가중치를 앎 |
가중최소제곱의 표준오차가 으로 가장 작습니다. 정보를 더 썼기 때문입니다.
계수가 과 으로 다른 것은 표본 하나의 흔들림입니다. 둘 다 불편이며, 표준오차가 정도이므로 이 차이는 우연 범위 안입니다.
(2) 가중치를 잘못 두면 어떻게 되는지 봅니다. 참 sd는 에 비례하는데 가중치를 으로 두고 을 바꿉니다.
| 가중치의 | 계수의 표준편차 | 표준오차 평균 | 실제 오류율 |
|---|---|---|---|
일 때 표준편차가 로 가장 작습니다. 참 가중치입니다.
계수의 평균은 에서 이고 에서 로 둘 다 불편입니다. 가중치가 틀려도 치우치지는 않습니다.
그런데 가중 모형 안에서 계산한 표준오차는 이 틀리면 함께 틀립니다. 에서 표준편차 인데 표준오차는 라 오류율이 ****입니다.
가중치를 확신할 수 없으면 가중 모형 안에서도 강건 표준오차를 써야 합니다.
이 문제에서 배우는 것. 가중최소제곱은 "분산 구조를 안다"는 조건을 하나 더 얹습니다. 그 조건이 맞으면 표준오차가 에서 로 퍼센트 줄어드는데, 틀리면 오류율이 까지 갑니다. 그래서 실무에서는 분산 구조를 추정해 쓰는 경우가 많고, 그러면 추정의 불확실성이 또 들어옵니다. 안전한 조합은 가중치는 대략 맞게 두고 표준오차는 강건하게 계산하는 것이며, 그러면 효율은 얻고 오류율은 지킵니다.
바로 확인 4.
확인 4-1. 가중최소제곱의 가중치를 식으로 쓰세요.
답. 그 자리 오차분산의 역수입니다.
확인 4-2. 검산에서 세 방법의 표준오차를 쓰세요.
답. , , 입니다.
확인 4-3. 검산에서 일 때의 표준편차와 오류율을 쓰세요.
답. 이고 오류율은 입니다.
문제. 남은 문제들을 정리합니다.
(1) 변환이 물음을 바꾸는지 확인하세요.
(2) 군집이 있을 때를 재세요.
(3) 상황별 판단을 세우세요.
생각의 실마리. 179강 문제 5에서 로그 변환이 비로 해석을 바꾼다고 했습니다. 이분산을 없애려고 로그를 취하면 그 대가가 따라옵니다.
풀이. (1) 오차의 sd가 에 비례해도 계수는 안 바뀝니다.
| 무엇 | 기울기 | 참값 |
|---|---|---|
| 최소제곱 |
그런데 를 로그로 바꾸면 재는 대상이 바뀝니다.
| 무엇을 회귀 | 계수 | 무엇의 변화 |
|---|---|---|
| 를 로 | 산술평균 | |
| 를 로 | 기하평균의 로그 |
두 계수가 과 으로 완전히 다릅니다. 같은 자료인데 다른 물음에 답하기 때문입니다.
179강 문제 5와 같은 이야기입니다. 이분산을 없애려고 로그를 취하면 답하는 물음도 함께 바뀝니다.
(2) 군집이 있을 때를 봅니다. 개 뭉치에서 뭉치당 명을 뽑습니다.
| 뭉치 안 상관 | 계수의 표준편차 | 보통 | HC3 | 군집 강건 |
|---|---|---|---|---|
뭉치 안 상관이 면 참 표준편차가 인데 HC3은 입니다. 세 배 넘게 작습니다.
HC3은 관측 하나하나가 독립이라고 보므로 뭉치를 못 봅니다. 이분산은 고쳐도 상관은 못 고칩니다.
군집 강건 표준오차가 으로 참값에 붙습니다. 173강 문제 3의 설계효과가 표준오차 쪽에서 나타난 것입니다.
(3) 상황별 판단을 세웁니다.
| 상황 | 무엇을 쓰는가 |
|---|---|
| 아무것도 모름 | HC3을 기본값으로 |
| 표본이 아주 작음 | 붓스트랩이나 순열 |
| 분산 구조를 앎 | 가중최소제곱 |
| 뭉치가 있음 | 군집 강건 |
| 시계열 | 자기상관까지 강건 |
이 강의의 결론은 하나입니다. 계수는 그대로이고 표준오차만 고치면 됩니다. 그리고 고치는 비용이 아주 싸므로 처음부터 고쳐 두는 것이 낫습니다.
이 문제에서 배우는 것. "강건"이라는 말이 무엇에 대해 강건한지를 밝혀야 합니다. HC 계열은 이분산에 강건할 뿐 상관에는 무력하고, 군집 강건은 뭉치 안 상관에 강건할 뿐 뭉치 수가 적으면 무너집니다. 뭉치가 개 미만이면 군집 강건도 헤퍼지며, 그때는 뭉치 단위 붓스트랩을 씁니다. 그래서 실무에서 물어야 할 것은 "강건 표준오차를 썼는가"가 아니라 **"무엇이 상관되어 있을 수 있는가"**이며, 그 답은 통계가 아니라 자료가 어떻게 모였는지가 정합니다.
바로 확인 5.
확인 5-1. 검산에서 원자료와 로그 자료의 계수를 쓰고 뜻을 밝히세요.
답. 과 이며 산술평균과 기하평균의 변화입니다.
확인 5-2. 검산에서 뭉치 안 상관이 일 때 세 표준오차를 쓰세요.
답. 참값 에 보통 , HC3 , 군집 강건 입니다.
확인 5-3. HC3이 군집을 못 잡는 이유를 쓰세요.
답. 관측 하나하나가 독립이라고 보기 때문입니다.
| 무엇 | w_ |
|---|---|
| 보통 | 하나로 통일 |
| HC0 | e_{i}^ |
| HC1 | |
| HC2 | |
| HC3 | e_{i}^{2}/(1-h_{i})^ |
| 무엇에 강건한가 | 무엇에 무력한가 |
|---|---|
| HC 계열: 이분산 | 상관, 작은 표본 |
| 군집 강건: 뭉치 안 상관 | 뭉치 수가 적을 때 |
| 가중최소제곱: 없음 | 가중치가 틀리면 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 이분산이면 언제나 헤퍼진다고 봅니다 | 레버리지와의 관계가 정합니다 |
| 표본을 늘리면 나아진다고 봅니다 | 틀린 값으로 수렴합니다 |
| 검정하고 방법을 고릅니다 | 언제나 HC3보다 낫지 않습니다 |
| 강건이면 다 강건하다고 봅니다 | 이분산에만 강건합니다 |
| 가중치를 넣고 안심합니다 | 틀리면 표준오차도 틀립니다 |
| 로그로 이분산을 없앱니다 | 물음이 함께 바뀝니다 |
문제 6. 이분산에서 계수와 표준오차가 각각 어떻게 되는지 쓰세요.
답. 계수는 여전히 불편이고 표준오차만 틀립니다.
문제 7. 검산에서 일 때의 비와 실제 오류율을 쓰세요.
답. 과 입니다.
문제 8. 표준오차가 작아질지 커질지를 무엇이 정하는지 쓰세요.
답. 오차분산과 레버리지의 상관이 양수인지 음수인지가 정합니다.
문제 9. 강건 표준오차가 무엇을 바꾸는지 쓰세요.
답. 가운데의 자리에 잔차 제곱을 하나씩 넣습니다.
문제 10. HC2와 HC3이 HC0과 다른 점을 쓰세요.
답. 레버리지로 나눠 지렛점의 잔차를 되살립니다.
문제 11. 검산에서 일 때 참 표준편차와 보통 표준오차를 쓰세요.
답. 와 입니다.
문제 12. 검산에서 일 때 네 방법의 오류율을 쓰세요.
답. , , , 입니다.
문제 13. 브루시-페이건 검정을 한 문장으로 쓰세요.
답. 잔차 제곱을 설명변수로 회귀해 설명되는지 봅니다.
문제 14. 검산에서 세 절차의 나쁜 쪽 오류율을 쓰세요.
답. , , 입니다.
문제 15. 검산에서 등분산일 때 HC3의 손해를 쓰세요.
답. 에서 배이고 에서 배입니다.
문제 16. 검산에서 세 방법의 표준오차를 쓰세요.
답. , , 입니다.
문제 17. 검산에서 일 때의 표준편차와 오류율을 쓰세요.
답. 이고 오류율은 입니다.
문제 18. 검산에서 뭉치 안 상관이 일 때 세 표준오차를 쓰세요.
답. 참값 에 보통 , HC3 , 군집 강건 입니다.
심화 1. 샌드위치 추정량의 구조를 정리하세요.
양쪽 빵은 언제나 같고 속만 바뀝니다.
| 무엇을 가정 | 속이 무엇이 되는가 |
|---|---|
| 등분산 | |
| 이분산 | \sum e_{i}^{2}\mathbf{x}_{i}\mathbf{x}_{i}^ |
| 군집 | \sum_{g}\mathbf{s}_{g}\mathbf{s}_{g}^ |
| 시계열 | 시차 항까지 더합니다 |
등분산이면 속이 빵의 역과 상쇄되어 익숙한 식이 됩니다.
그래서 강건 표준오차가 일반형이고 보통이 특수형입니다. 순서가 반대로 배우는 것뿐입니다.
심화 2. 시계열의 자기상관까지 다루는 법을 정리하세요.
오차가 시간에 따라 상관되면 심화 1의 속에 시차 항을 더합니다.
| 무엇을 정해야 하는가 | 왜 |
|---|---|
| 시차 | 얼마나 멀리까지 상관되는가 |
| 가중 | 먼 시차를 덜 세기 위해 |
뉴이-웨스트 추정량이 대표적입니다. 가중을 삼각형으로 두어 속이 양정치가 되도록 보장합니다.
을 크게 두면 편향이 줄고 분산이 늡니다. 169강의 대역폭 선택과 같은 맞바꿈이며, 관례는 입니다.
197강에서 자기상관 자체를 모형으로 다룹니다. 그때는 표준오차를 고치는 대신 오차 구조를 명시합니다.
심화 3. 이분산의 원인을 정리하세요.
| 원인 | 예 |
|---|---|
| 집계 자료 | 인구가 다른 지역의 평균 |
| 비례 오차 | 큰 값일수록 오차도 큼 |
| 빠진 변수 | 집단마다 다른 효과 |
| 잘못된 함수 형태 | 굽은 것을 직선으로 |
| 이산 결과 | 이항의 분산이 |
첫째 줄이 가장 깔끔한 경우입니다. 지역 평균의 분산이 이므로 가중치를 정확히 알 수 있고, 문제 4의 가중최소제곱이 정확히 맞습니다.
셋째와 넷째 줄은 이분산이 증상일 뿐입니다. 184강 문제 4에서 굽은 관계에 직선을 얹으면 잔차가 체계적으로 벌어졌는데, 그것을 이분산으로 보고 표준오차만 고치면 진짜 문제를 덮습니다.
다섯째 줄이 190강으로 이어집니다. 이항 결과에서는 분산이 평균에 매여 있으므로, 이분산이 기본값이고 그것을 모형에 넣는 것이 로지스틱 회귀입니다.
심화 4. 붓스트랩으로 표준오차를 만드는 법을 정리하세요.
179강 문제 4의 붓스트랩을 회귀에 씁니다.
| 방법 | 무엇을 다시 뽑는가 | 언제 |
|---|---|---|
| 짝 붓스트랩 | 쌍 | 이분산 있어도 됩니다 |
| 잔차 붓스트랩 | 잔차만 | 등분산일 때만 |
| 야생 붓스트랩 | 잔차에 부호를 곱함 | 이분산에 작은 표본 |
첫째 줄이 가장 단순하고 이분산에 자동으로 강건합니다. 까지 함께 뽑으므로 설계행렬이 표본마다 달라지는 것이 유일한 단점입니다.
셋째 줄이 작은 표본의 답입니다. 잔차에 평균 , 분산 인 무작위 부호를 곱해 각 자리의 분산 구조를 보존합니다.
문제 2에서 일 때 HC3도 이었는데, 야생 붓스트랩은 그 자리에서 목표에 더 가깝습니다.
심화 5. 군집 강건의 한계를 정리하세요.
문제 5에서 군집 강건이 참값에 붙었는데 조건이 있습니다.
| 무엇이 필요한가 | 왜 |
|---|---|
| 뭉치 수가 충분 | 속을 뭉치 수로 추정합니다 |
| 뭉치끼리 독립 | 뭉치 사이 상관은 못 잡습니다 |
| 뭉치 크기가 고르면 좋음 | 한 뭉치가 지배하면 나빠집니다 |
첫째 줄이 실무의 병목입니다. 뭉치가 개 미만이면 헤퍼지고, 개 미만이면 쓸 수 없습니다.
뭉치 수가 적으면 자유도를 로 두고 분포를 씁니다. 그래도 부족하면 뭉치 단위 야생 붓스트랩이 표준 대안입니다.
그리고 무엇을 뭉치로 볼지가 자료가 아니라 설계의 물음입니다. 학생이 학급에 속하고 학급이 학교에 속하면, 처치가 배정된 수준에서 묶어야 합니다.
심화 6. 이 강의가 어디에 쓰이는지 정리하세요.
| 분야 | 쓰임 | 이어지는 강의 |
|---|---|---|
| 변수 선택 | 잘못된 형태의 진단 | 189강 |
| 이산 결과 | 평균과 분산의 연결 | 190강 |
| 인과추론 | 군집 배정 실험 | 192강 |
| 시계열 | 자기상관 구조 | 197강 |
셋째 줄이 실무에서 가장 자주 걸립니다. 실험을 개인이 아니라 매장이나 지역 단위로 배정하면 뭉치가 생기고, 개인 수준에서 표준오차를 계산하면 문제 5의 셋째 줄처럼 세 배 작게 나옵니다.
A/B 테스트에서 이 실수가 매우 흔합니다. 사용자 단위로 배정했는데 세션 단위로 세면 같은 문제가 생기며, 표본이 커 보여 더 확신하게 되므로 더 위험합니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 이분산 | heteroskedasticity | 오차의 분산이 자리마다 다릅니다 |
| 등분산 | homoskedasticity | 오차의 분산이 모두 같습니다 |
| \sigma_{i}^ | 시그마 아이 제곱 | 번째 관측의 오차분산입니다 |
| h_ | 레버리지 | 가 얼마나 멀리 있는지입니다 |
| 샌드위치 추정량 | sandwich estimator | 빵과 속으로 이루어진 분산 추정입니다 |
| HC0~HC3 | 이분산 일치 추정량 | 속의 가중을 달리한 변형입니다 |
| 브루시-페이건 | Breusch-Pagan | 잔차 제곱을 회귀하는 검정입니다 |
| 화이트 검정 | White test | 제곱과 곱까지 넣은 확장입니다 |
| 가중최소제곱 | weighted least squares | 분산의 역수로 무게를 줍니다 |
| 군집 강건 | cluster-robust | 뭉치를 하나로 묶어 계산합니다 |
| 뉴이-웨스트 | Newey-West | 자기상관까지 다루는 추정량입니다 |
| 야생 붓스트랩 | wild bootstrap | 잔차에 무작위 부호를 곱합니다 |
다음은 189강 변수선택과 모형 비교입니다. 184강부터 여기까지 모형이 주어져 있었습니다.
185강 문제 4에서 잡음 변수만 넣어도 이 오르는 것을 봤고, 186강 문제 5에서 곱 항까지 세면 개가 되는 것을 봤습니다. 189강은 모형을 고르는 기준을 세우고, 그 기준을 자료로 정하는 순간 178강 문제 2의 문제가 가장 큰 규모로 되돌아온다는 것을 보입니다.
import numpy as np
rng = np.random.default_rng(20260925)
def pw(s, n):
k = n - sum(2 if ord(c) > 0x2FFF else 1 for c in str(s))
return str(s) + " " * max(k, 0)
def rw(s, n):
k = n - sum(2 if ord(c) > 0x2FFF else 1 for c in str(s))
return " " * max(k, 0) + str(s)
def erf(x):
a = abs(float(x))
if a > 6.0:
return 1.0 if x > 0 else -1.0
t, ssum, kk = 1.0, 1.0, 0
while True:
kk += 1
t *= 2.0 * a * a / (2.0 * kk + 1.0)
ssum += t
if t < 1e-18 * ssum:
break
v = 2.0 * a / np.sqrt(np.pi) * np.exp(-a * a) * ssum
return v if x > 0 else -v
def p2(z):
return 1.0 - erf(abs(float(z)) / np.sqrt(2.0))
def fit(y, *xs):
A = np.stack([np.ones(len(y))] + list(xs), axis=1)
XtXi = np.linalg.inv(A.T @ A)
b = XtXi @ A.T @ y
e = y - A @ b
n, p = A.shape
s2 = (e ** 2).sum() / (n - p)
se_ols = np.sqrt(s2 * np.diag(XtXi))
h = np.einsum("ij,jk,ik->i", A, XtXi, A)
out = {"b": b, "e": e, "A": A, "XtXi": XtXi, "n": n, "p": p, "h": h,
"se_ols": se_ols, "s2": s2}
for nm, w in [("hc0", e ** 2),
("hc1", e ** 2 * n / (n - p)),
("hc2", e ** 2 / (1.0 - h)),
("hc3", e ** 2 / (1.0 - h) ** 2)]:
meat = (A * w[:, None]).T @ A
out["se_" + nm] = np.sqrt(np.diag(XtXi @ meat @ XtXi))
return out
# --- 문제 1: 등분산이 깨지면 무엇이 틀리는가 ----------------------------
print(" 184강 심화 4 의 가우스-마르코프는 등분산을 가정했습니다")
print(" 그 가정이 깨지면 계수는 그대로인데 표준오차가 틀립니다")
R1, N1 = 20000, 100
x1g = np.linspace(0.5, 5.0, N1)
print(" x 를 0.5 부터 5.0 까지 두고 오차의 sd 를 x 의 거듭제곱으로 둡니다")
print(" %s %s %s %s %s"
% (pw("오차 sd 가 x^k", 16), rw("계수의 참 표준편차", 20),
rw("보통 표준오차의 평균", 22), rw("비", 10), rw("실제 오류율", 14)))
for k in [0.0, 0.5, 1.0, 1.5, 2.0]:
sd = x1g ** k
bs, ses = [], []
for _ in range(R1 // 10):
y = 1.0 * x1g + rng.normal(0, 1.0, N1) * sd
f = fit(y, x1g)
bs.append(f["b"][1])
ses.append(f["se_ols"][1])
bs = np.array(bs)
ses = np.array(ses)
hit = float((np.abs(bs - 1.0) / ses > 1.959964).mean())
print(" %s %20.6f %22.6f %10.4f %14.4f"
% (pw("k = %.1f" % k, 16), float(bs.std(ddof=1)), float(ses.mean()),
float(ses.mean()) / float(bs.std(ddof=1)), hit))
print(" 계수 자체는 참값 1.0 둘레에 그대로 있습니다. 불편성은 안 깨집니다")
print(" 그런데 보통 표준오차가 참 표준편차보다 작아지고 오류율이 오릅니다")
print(" k = 2.0 이면 0.05 를 겨냥했는데 실제로는 0.1035 가 됩니다")
print(" 방향은 자료가 정합니다")
print(" 오차가 큰 자리가 x 의 어디냐로 방향이 갈립니다")
lev = (x1g - x1g.mean()) ** 2
print(" 레버리지는 x 가 평균에서 멀수록 큽니다. 그것과 오차의 관계를 함께 봅니다")
print(" %s %s %s %s %s"
% (pw("오차가 큰 자리", 22), rw("오차분산과 레버리지의 상관", 28),
rw("계수의 참 표준편차", 20), rw("보통 표준오차 평균", 22), rw("비", 10)))
cases = [("x 가 클수록 큼", x1g ** 1.5),
("x 가 작을수록 큼", (5.5 - x1g) ** 1.5),
("가운데가 큼", (2.5 - np.abs(x1g - 2.75)) ** 1.5 + 0.5)]
for nm, sd in cases:
bs, ses = [], []
for _ in range(R1 // 10):
y = 1.0 * x1g + rng.normal(0, 1.0, N1) * sd
f = fit(y, x1g)
bs.append(f["b"][1])
ses.append(f["se_ols"][1])
bs = np.array(bs)
ses = np.array(ses)
cr = float(np.corrcoef(sd ** 2, lev)[0, 1])
print(" %s %28.4f %20.6f %22.6f %10.4f"
% (pw(nm, 22), cr, float(bs.std(ddof=1)), float(ses.mean()),
float(ses.mean()) / float(bs.std(ddof=1))))
print(" 상관이 양수인 두 줄에서 보통 표준오차가 작게 나옵니다. 헤퍼집니다")
print(" 상관이 음수인 셋째 줄에서는 크게 나옵니다. 조심스러워집니다")
print(" 중요한 것은 x 의 방향이 아니라 오차가 큰 자리가 레버리지가 큰 자리인가입니다")
print(" 이분산이 있으면 언제나 헤퍼진다는 말은 틀립니다. 방향이 자료에 달렸습니다")
# --- 문제 2: 표준오차만 고치기 ------------------------------------------
print(" 모형을 안 고치고 표준오차만 고칠 수 있습니다")
print(" 보통 표준오차는 가운데에 s^2 곱하기 XtX 를 씁니다")
print(" 강건 표준오차는 그 자리에 잔차 제곱을 하나씩 넣습니다")
N2 = 200
x2 = np.linspace(0.5, 5.0, N2)
y2 = 1.0 * x2 + rng.normal(0, 1.0, N2) * x2 ** 1.5
f2 = fit(y2, x2)
print(" %s %s %s %s" % (pw("무엇", 20), rw("기울기의 표준오차", 20),
rw("t", 12), rw("p 값", 14)))
for nm, key in [("보통", "se_ols"), ("HC0", "se_hc0"), ("HC1", "se_hc1"),
("HC2", "se_hc2"), ("HC3", "se_hc3")]:
se = f2[key][1]
print(" %s %20.6f %12.4f %14.6f"
% (pw(nm, 20), se, f2["b"][1] / se, p2(f2["b"][1] / se)))
print(" 계수는 %.6f 로 하나뿐이고 표준오차만 여럿입니다" % f2["b"][1])
print(" HC0 은 잔차 제곱을 그대로 쓰고 HC1 은 자유도로 보정합니다")
print(" HC2 와 HC3 은 레버리지로 나눠 큰 지렛점을 더 크게 셉니다")
print(" 어느 것이 실제로 맞는지 모의로 확인합니다")
R2 = 4000
print(" 참 표준편차와 각 표준오차의 평균을 견줍니다. 표본 크기를 바꿔 봅니다")
print(" %s %s %s %s %s %s"
% (pw("표본 크기", 10), rw("참 표준편차", 14), rw("보통", 12), rw("HC0", 12),
rw("HC2", 12), rw("HC3", 12)))
for n in [20, 50, 200, 1000]:
xg = np.linspace(0.5, 5.0, n)
sd = xg ** 1.5
bs = []
acc = {"se_ols": [], "se_hc0": [], "se_hc2": [], "se_hc3": []}
for _ in range(R2):
y = 1.0 * xg + rng.normal(0, 1.0, n) * sd
f = fit(y, xg)
bs.append(f["b"][1])
for kk in acc:
acc[kk].append(f[kk][1])
print(" %s %14.6f %12.6f %12.6f %12.6f %12.6f"
% (pw("%d" % n, 10), float(np.std(bs, ddof=1)),
float(np.mean(acc["se_ols"])), float(np.mean(acc["se_hc0"])),
float(np.mean(acc["se_hc2"])), float(np.mean(acc["se_hc3"]))))
print(" 보통 표준오차는 표본이 커져도 참값에 안 붙습니다. 틀린 값으로 수렴합니다")
print(" HC0 은 작은 표본에서 아래로 치우칩니다. HC3 이 가장 잘 맞습니다")
print(" 실제 오류율로도 봅니다")
print(" %s %s %s %s %s %s"
% (pw("표본 크기", 10), rw("보통", 12), rw("HC0", 12), rw("HC1", 12),
rw("HC3", 12), rw("목표", 10)))
for n in [20, 50, 200, 1000]:
xg = np.linspace(0.5, 5.0, n)
sd = xg ** 1.5
cnt = {"se_ols": 0, "se_hc0": 0, "se_hc1": 0, "se_hc3": 0}
for _ in range(R2):
y = 1.0 * xg + rng.normal(0, 1.0, n) * sd
f = fit(y, xg)
for kk in cnt:
if abs(f["b"][1] - 1.0) / f[kk][1] > 1.959964:
cnt[kk] += 1
print(" %s %12.4f %12.4f %12.4f %12.4f %10.2f"
% (pw("%d" % n, 10), cnt["se_ols"] / R2, cnt["se_hc0"] / R2,
cnt["se_hc1"] / R2, cnt["se_hc3"] / R2, 0.05))
print(" HC3 이 작은 표본에서도 목표에 가장 가깝습니다")
print(" 표본이 20 이면 HC0 도 아직 헤픕니다. 그럴 때는 179강의 순열이나 붓스트랩을 씁니다")
# --- 문제 3: 이분산이 있는지 어떻게 아는가 ------------------------------
print(" 잔차 제곱을 설명변수로 회귀하면 검정이 됩니다")
N3 = 300
x3 = np.linspace(0.5, 5.0, N3)
print(" 브루시-페이건 검정은 잔차 제곱을 x 로 회귀해 설명되는지 봅니다")
print(" %s %s %s %s %s"
% (pw("자료", 24), rw("잔차제곱의 R^2", 18), rw("LM 통계량", 14),
rw("p 값", 14), rw("기각", 10)))
for nm, sd in [("등분산", np.ones(N3)),
("x 에 비례", x3 / 2.5),
("x 의 제곱에 비례", (x3 / 2.5) ** 2),
("두 덩어리", np.where(x3 < 2.75, 0.5, 2.0))]:
y = 1.0 * x3 + rng.normal(0, 1.0, N3) * sd
f = fit(y, x3)
e2 = f["e"] ** 2
g = fit(e2, x3)
r2 = 1.0 - (g["e"] ** 2).sum() / ((e2 - e2.mean()) ** 2).sum()
lm = N3 * r2
pv = np.exp(-lm / 2.0)
print(" %s %18.6f %14.6f %14.8f %s"
% (pw(nm, 24), r2, lm, pv, rw("예" if pv < 0.05 else "아니오", 10)))
print(" 자유도 1 인 카이제곱의 꼬리 확률이 exp(-LM/2) 입니다")
print(" 등분산에서는 기각을 안 하고 나머지 셋에서는 기각합니다")
print(" 검정으로 방법을 고르면 안 됩니다")
print(" 178강 문제 2 의 두 단계 절차 문제가 여기서도 그대로입니다")
print(" %s %s %s %s %s"
% (pw("절차", 22), rw("이분산일 때", 16), rw("등분산일 때", 16),
rw("둘 중 나쁜 쪽", 16), rw("목표", 10)))
R3, n3b = 4000, 60
xg = np.linspace(0.5, 5.0, n3b)
res3 = {}
for scen, sdv in [("hetero", xg ** 1.5), ("homo", np.ones(n3b))]:
cnt = {"always_ols": 0, "always_hc3": 0, "two_step": 0, "rejected": 0}
for _ in range(R3):
y = 1.0 * xg + rng.normal(0, 1.0, n3b) * sdv
f = fit(y, xg)
e2 = f["e"] ** 2
g = fit(e2, xg)
r2 = 1.0 - (g["e"] ** 2).sum() / ((e2 - e2.mean()) ** 2).sum()
pv = np.exp(-n3b * r2 / 2.0)
if pv < 0.05:
cnt["rejected"] += 1
if abs(f["b"][1] - 1.0) / f["se_ols"][1] > 1.959964:
cnt["always_ols"] += 1
if abs(f["b"][1] - 1.0) / f["se_hc3"][1] > 1.959964:
cnt["always_hc3"] += 1
key = "se_hc3" if pv < 0.05 else "se_ols"
if abs(f["b"][1] - 1.0) / f[key][1] > 1.959964:
cnt["two_step"] += 1
res3[scen] = cnt
for nm, kk in [("언제나 보통", "always_ols"), ("언제나 HC3", "always_hc3"),
("검정하고 고름", "two_step")]:
a = res3["hetero"][kk] / R3
b = res3["homo"][kk] / R3
print(" %s %16.4f %16.4f %16.4f %10.2f"
% (pw(nm, 22), a, b, max(a, b), 0.05))
print(" 브루시-페이건이 기각한 비율은 이분산에서 %.4f 이고 등분산에서 %.4f 입니다"
% (res3["hetero"]["rejected"] / R3, res3["homo"]["rejected"] / R3))
print(" 이분산에서는 검정이 거의 언제나 기각해 두 단계가 HC3 과 같아집니다")
print(" 등분산에서는 가끔 잘못 기각해 두 단계가 보통보다 조금 헤퍼집니다")
print(" 어느 쪽에서도 두 단계가 언제나 HC3 보다 낫지 않습니다. 절차만 복잡해집니다")
print(" HC3 은 등분산일 때 손해가 거의 없으므로 처음부터 쓰면 됩니다")
print(" 등분산일 때 강건 표준오차의 손해를 잽니다")
print(" %s %s %s %s"
% (pw("표본 크기", 12), rw("보통 표준오차 평균", 20), rw("HC3 평균", 14),
rw("HC3 이 몇 배", 14)))
for n in [30, 100, 500, 2000]:
xg2 = np.linspace(0.5, 5.0, n)
a1, a2 = [], []
for _ in range(2000):
y = 1.0 * xg2 + rng.normal(0, 1.0, n)
f = fit(y, xg2)
a1.append(f["se_ols"][1])
a2.append(f["se_hc3"][1])
print(" %s %20.6f %14.6f %14.4f"
% (pw("%d" % n, 12), float(np.mean(a1)), float(np.mean(a2)),
float(np.mean(a2)) / float(np.mean(a1))))
print(" 등분산이어도 HC3 이 조금 큽니다. 표본이 크면 차이가 사라집니다")
print(" 그 정도가 이분산일 때 얻는 것에 비해 아주 쌉니다")
# --- 문제 4: 모형을 고치는 길 -------------------------------------------
print(" 표준오차만 고치는 대신 모형을 고칠 수도 있습니다")
N4 = 400
x4 = np.linspace(0.5, 5.0, N4)
sd4 = x4 ** 1.0
y4 = 2.0 + 1.0 * x4 + rng.normal(0, 1.0, N4) * sd4
print(" 오차의 sd 가 x 에 비례하는 자료입니다. 참 기울기는 1.0 입니다")
w = 1.0 / sd4 ** 2
Aw = np.stack([np.ones(N4), x4], axis=1) * np.sqrt(w)[:, None]
yw = y4 * np.sqrt(w)
bw = np.linalg.lstsq(Aw, yw, rcond=None)[0]
ew = yw - Aw @ bw
s2w = (ew ** 2).sum() / (N4 - 2)
sew = np.sqrt(s2w * np.diag(np.linalg.inv(Aw.T @ Aw)))
f4 = fit(y4, x4)
ylog = np.log(np.maximum(y4 - y4.min() + 1.0, 1e-9))
print(" %s %s %s %s" % (pw("방법", 24), rw("기울기", 14), rw("표준오차", 14),
rw("무엇을 가정", 20)))
print(" %s %14.6f %14.6f %s"
% (pw("보통 최소제곱", 24), f4["b"][1], f4["se_ols"][1], rw("등분산", 20)))
print(" %s %14.6f %14.6f %s"
% (pw("최소제곱에 HC3", 24), f4["b"][1], f4["se_hc3"][1], rw("없음", 20)))
print(" %s %14.6f %14.6f %s"
% (pw("가중최소제곱", 24), bw[1], sew[1], rw("가중치를 앎", 20)))
print(" 가중최소제곱이 표준오차가 가장 작습니다. 정보를 더 썼기 때문입니다")
print(" 대신 가중치가 틀리면 오히려 나빠집니다. 다음 표에서 봅니다")
print(" 가중치를 잘못 두면 어떻게 되는지 봅니다")
R4 = 3000
print(" 참 sd 는 x 에 비례합니다. 가중치를 x^m 으로 두고 m 을 바꿔 봅니다")
print(" %s %s %s %s"
% (pw("가중치의 m", 14), rw("계수의 표준편차", 18), rw("표준오차 평균", 18),
rw("실제 오류율", 14)))
res4 = {}
for m in [0.0, 0.5, 1.0, 1.5, 2.0]:
wm = 1.0 / (x4 ** m) ** 2
Am = np.stack([np.ones(N4), x4], axis=1) * np.sqrt(wm)[:, None]
bs, ses = [], []
for _ in range(R4):
yy = 2.0 + 1.0 * x4 + rng.normal(0, 1.0, N4) * sd4
ym = yy * np.sqrt(wm)
bb = np.linalg.lstsq(Am, ym, rcond=None)[0]
ee = ym - Am @ bb
ss = (ee ** 2).sum() / (N4 - 2)
sm = np.sqrt(ss * np.diag(np.linalg.inv(Am.T @ Am)))
bs.append(bb[1])
ses.append(sm[1])
bs = np.array(bs)
ses = np.array(ses)
hit = float((np.abs(bs - 1.0) / ses > 1.959964).mean())
res4[m] = (float(bs.std(ddof=1)), float(ses.mean()), hit, float(bs.mean()))
print(" %s %18.6f %18.6f %14.4f"
% (pw("%.1f" % m, 14), float(bs.std(ddof=1)), float(ses.mean()), hit))
print(" m 이 1.0 일 때 표준편차가 %.6f 로 가장 작습니다. 참 가중치입니다"
% res4[1.0][0])
print(" 계수의 평균은 m 이 0.0 일 때 %.6f 이고 2.0 일 때 %.6f 로 둘 다 불편입니다"
% (res4[0.0][3], res4[2.0][3]))
print(" 그런데 가중 모형 안에서 계산한 표준오차는 m 이 틀리면 함께 틀립니다")
print(" m 이 2.0 이면 표준편차 %.6f 인데 표준오차는 %.6f 이라 오류율이 %.4f 입니다"
% (res4[2.0][0], res4[2.0][1], res4[2.0][2]))
print(" 가중치를 확신할 수 없으면 가중 모형 안에서도 강건 표준오차를 써야 합니다")
# --- 문제 5: 무엇을 보고할 것인가 ---------------------------------------
print(" 이분산이 계수 자체를 바꾸는 경우도 있습니다")
N5 = 3000
x5 = rng.uniform(0.2, 5.0, N5)
y5a = 1.0 * x5 + rng.normal(0, 1.0, N5) * x5
print(" 오차의 sd 가 x 에 비례하면 계수는 안 바뀝니다")
print(" %s %s %s" % (pw("무엇", 24), rw("기울기", 14), rw("참값", 12)))
print(" %s %14.6f %12.1f" % (pw("최소제곱", 24), fit(y5a, x5)["b"][1], 1.0))
ylog5 = np.log(1.0 * x5 + 1.0) + rng.normal(0, 0.5, N5)
print(" 그런데 y 를 로그로 바꾸면 재는 대상이 바뀝니다")
print(" %s %s %s" % (pw("무엇을 회귀", 24), rw("계수", 14), rw("무엇의 변화", 20)))
print(" %s %14.6f %s" % (pw("y 를 x 로", 24), fit(np.exp(ylog5), x5)["b"][1],
rw("산술평균", 20)))
print(" %s %14.6f %s" % (pw("log y 를 x 로", 24), fit(ylog5, x5)["b"][1],
rw("기하평균의 로그", 20)))
print(" 179강 문제 5 와 같은 이야기입니다. 변환은 물음을 바꿉니다")
print(" 이분산을 없애려고 로그를 취하면 답하는 물음도 함께 바뀝니다")
print(" 군집이 있으면 강건 표준오차로도 부족합니다")
G, M = 60, 20
print(" %d 개 뭉치에서 뭉치당 %d 명을 뽑습니다. 173강 문제 3 의 구조입니다" % (G, M))
print(" %s %s %s %s %s"
% (pw("뭉치 안 상관", 14), rw("계수의 표준편차", 18), rw("보통", 12),
rw("HC3", 12), rw("군집 강건", 14)))
R5 = 1500
for rho in [0.0, 0.2, 0.5]:
bs, s1, s2v, s3 = [], [], [], []
for _ in range(R5):
gid = np.repeat(np.arange(G), M)
ug = rng.normal(0, np.sqrt(rho), G)
xg3 = rng.normal(0, 1, G)
xx = np.repeat(xg3, M) + rng.normal(0, 0.3, G * M)
yy = 1.0 * xx + np.repeat(ug, M) + rng.normal(0, np.sqrt(1.0 - rho), G * M)
f = fit(yy, xx)
A, XtXi, e = f["A"], f["XtXi"], f["e"]
meat = np.zeros((2, 2))
for gg in range(G):
idx = gid == gg
sg = (A[idx] * e[idx][:, None]).sum(0)
meat += np.outer(sg, sg)
sec = np.sqrt(np.diag(XtXi @ meat @ XtXi))
bs.append(f["b"][1])
s1.append(f["se_ols"][1])
s2v.append(f["se_hc3"][1])
s3.append(sec[1])
print(" %s %18.6f %12.6f %12.6f %14.6f"
% (pw("%.1f" % rho, 14), float(np.std(bs, ddof=1)), float(np.mean(s1)),
float(np.mean(s2v)), float(np.mean(s3))))
print(" 뭉치 안 상관이 커지면 보통도 HC3 도 참값보다 작아집니다")
print(" HC3 은 관측 하나하나가 독립이라고 보므로 뭉치를 못 봅니다")
print(" 군집 강건 표준오차는 뭉치를 하나로 묶어 계산해 참값에 붙습니다")
print(" 무엇을 보고할지 정리합니다")
print(" %s %s" % (pw("상황", 26), rw("무엇을 쓰는가", 26)))
for a, b in [("아무것도 모름", "HC3 을 기본값으로"),
("표본이 아주 작음", "붓스트랩이나 순열"),
("분산 구조를 앎", "가중최소제곱"),
("뭉치가 있음", "군집 강건"),
("시계열", "자기상관까지 강건")]:
print(" %s %s" % (pw(a, 26), rw(b, 26)))
print(" 이 강의의 결론은 하나입니다. 계수는 그대로이고 표준오차만 고치면 됩니다")
print(" 그리고 고치는 비용이 아주 싸므로 처음부터 고쳐 두는 것이 낫습니다")
# 184강 심화 4 의 가우스-마르코프는 등분산을 가정했습니다
# 그 가정이 깨지면 계수는 그대로인데 표준오차가 틀립니다
# x 를 0.5 부터 5.0 까지 두고 오차의 sd 를 x 의 거듭제곱으로 둡니다
# 오차 sd 가 x^k 계수의 참 표준편차 보통 표준오차의 평균 비 실제 오류율
# k = 0.0 0.077086 0.076081 0.9870 0.0550
# k = 0.5 0.124913 0.126168 1.0100 0.0485
# k = 1.0 0.244168 0.230246 0.9430 0.0740
# k = 1.5 0.521069 0.446615 0.8571 0.0975
# k = 2.0 1.073800 0.895818 0.8343 0.1035
# 계수 자체는 참값 1.0 둘레에 그대로 있습니다. 불편성은 안 깨집니다
# 그런데 보통 표준오차가 참 표준편차보다 작아지고 오류율이 오릅니다
# k = 2.0 이면 0.05 를 겨냥했는데 실제로는 0.1035 가 됩니다
# 방향은 자료가 정합니다
# 오차가 큰 자리가 x 의 어디냐로 방향이 갈립니다
# 레버리지는 x 가 평균에서 멀수록 큽니다. 그것과 오차의 관계를 함께 봅니다
# 오차가 큰 자리 오차분산과 레버리지의 상관 계수의 참 표준편차 보통 표준오차 평균 비
# x 가 클수록 큼 0.3510 0.518445 0.446725 0.8617
# x 가 작을수록 큼 0.3510 0.511794 0.448779 0.8769
# 가운데가 큼 -0.8447 0.111100 0.190897 1.7182
# 상관이 양수인 두 줄에서 보통 표준오차가 작게 나옵니다. 헤퍼집니다
# 상관이 음수인 셋째 줄에서는 크게 나옵니다. 조심스러워집니다
# 중요한 것은 x 의 방향이 아니라 오차가 큰 자리가 레버리지가 큰 자리인가입니다
# 이분산이 있으면 언제나 헤퍼진다는 말은 틀립니다. 방향이 자료에 달렸습니다
# 모형을 안 고치고 표준오차만 고칠 수 있습니다
# 보통 표준오차는 가운데에 s^2 곱하기 XtX 를 씁니다
# 강건 표준오차는 그 자리에 잔차 제곱을 하나씩 넣습니다
# 무엇 기울기의 표준오차 t p 값
# 보통 0.350313 2.8276 0.004690
# HC0 0.414792 2.3881 0.016937
# HC1 0.416882 2.3761 0.017497
# HC2 0.418037 2.3695 0.017811
# HC3 0.421310 2.3511 0.018717
# 계수는 0.990551 로 하나뿐이고 표준오차만 여럿입니다
# HC0 은 잔차 제곱을 그대로 쓰고 HC1 은 자유도로 보정합니다
# HC2 와 HC3 은 레버리지로 나눠 큰 지렛점을 더 크게 셉니다
# 어느 것이 실제로 맞는지 모의로 확인합니다
# 참 표준편차와 각 표준오차의 평균을 견줍니다. 표본 크기를 바꿔 봅니다
# 표본 크기 참 표준편차 보통 HC0 HC2 HC3
# 20 1.148624 0.950650 0.982660 1.062679 1.150149
# 50 0.735151 0.626026 0.691086 0.712417 0.734491
# 200 0.368964 0.318732 0.363010 0.365745 0.368503
# 1000 0.165869 0.143306 0.164368 0.164614 0.164860
# 보통 표준오차는 표본이 커져도 참값에 안 붙습니다. 틀린 값으로 수렴합니다
# HC0 은 작은 표본에서 아래로 치우칩니다. HC3 이 가장 잘 맞습니다
# 실제 오류율로도 봅니다
# 표본 크기 보통 HC0 HC1 HC3 목표
# 20 0.1158 0.1270 0.1060 0.0830 0.05
# 50 0.0887 0.0720 0.0678 0.0587 0.05
# 200 0.0915 0.0583 0.0580 0.0548 0.05
# 1000 0.0902 0.0560 0.0558 0.0553 0.05
# HC3 이 작은 표본에서도 목표에 가장 가깝습니다
# 표본이 20 이면 HC0 도 아직 헤픕니다. 그럴 때는 179강의 순열이나 붓스트랩을 씁니다
# 잔차 제곱을 설명변수로 회귀하면 검정이 됩니다
# 브루시-페이건 검정은 잔차 제곱을 x 로 회귀해 설명되는지 봅니다
# 자료 잔차제곱의 R^2 LM 통계량 p 값 기각
# 등분산 0.000279 0.083676 0.95902511 아니오
# x 에 비례 0.206858 62.057509 0.00000000 예
# x 의 제곱에 비례 0.151524 45.457265 0.00000000 예
# 두 덩어리 0.137553 41.266035 0.00000000 예
# 자유도 1 인 카이제곱의 꼬리 확률이 exp(-LM/2) 입니다
# 등분산에서는 기각을 안 하고 나머지 셋에서는 기각합니다
# 검정으로 방법을 고르면 안 됩니다
# 178강 문제 2 의 두 단계 절차 문제가 여기서도 그대로입니다
# 절차 이분산일 때 등분산일 때 둘 중 나쁜 쪽 목표
# 언제나 보통 0.0993 0.0503 0.0993 0.05
# 언제나 HC3 0.0653 0.0480 0.0653 0.05
# 검정하고 고름 0.0655 0.0503 0.0655 0.05
# 브루시-페이건이 기각한 비율은 이분산에서 0.9795 이고 등분산에서 0.0118 입니다
# 이분산에서는 검정이 거의 언제나 기각해 두 단계가 HC3 과 같아집니다
# 등분산에서는 가끔 잘못 기각해 두 단계가 보통보다 조금 헤퍼집니다
# 어느 쪽에서도 두 단계가 언제나 HC3 보다 낫지 않습니다. 절차만 복잡해집니다
# HC3 은 등분산일 때 손해가 거의 없으므로 처음부터 쓰면 됩니다
# 등분산일 때 강건 표준오차의 손해를 잽니다
# 표본 크기 보통 표준오차 평균 HC3 평균 HC3 이 몇 배
# 30 0.134503 0.140614 1.0454
# 100 0.076062 0.076788 1.0095
# 500 0.034361 0.034440 1.0023
# 2000 0.017203 0.017206 1.0002
# 등분산이어도 HC3 이 조금 큽니다. 표본이 크면 차이가 사라집니다
# 그 정도가 이분산일 때 얻는 것에 비해 아주 쌉니다
# 표준오차만 고치는 대신 모형을 고칠 수도 있습니다
# 오차의 sd 가 x 에 비례하는 자료입니다. 참 기울기는 1.0 입니다
# 방법 기울기 표준오차 무엇을 가정
# 보통 최소제곱 1.058191 0.106341 등분산
# 최소제곱에 HC3 1.058191 0.109150 없음
# 가중최소제곱 1.009815 0.082226 가중치를 앎
# 가중최소제곱이 표준오차가 가장 작습니다. 정보를 더 썼기 때문입니다
# 대신 가중치가 틀리면 오히려 나빠집니다. 다음 표에서 봅니다
# 가중치를 잘못 두면 어떻게 되는지 봅니다
# 참 sd 는 x 에 비례합니다. 가중치를 x^m 으로 두고 m 을 바꿔 봅니다
# 가중치의 m 계수의 표준편차 표준오차 평균 실제 오류율
# 0.0 0.125401 0.116791 0.0723
# 0.5 0.094249 0.092529 0.0577
# 1.0 0.084888 0.084624 0.0557
# 1.5 0.099859 0.092246 0.0700
# 2.0 0.160897 0.115494 0.1587
# m 이 1.0 일 때 표준편차가 0.084888 로 가장 작습니다. 참 가중치입니다
# 계수의 평균은 m 이 0.0 일 때 1.000913 이고 2.0 일 때 0.993292 로 둘 다 불편입니다
# 그런데 가중 모형 안에서 계산한 표준오차는 m 이 틀리면 함께 틀립니다
# m 이 2.0 이면 표준편차 0.160897 인데 표준오차는 0.115494 이라 오류율이 0.1587 입니다
# 가중치를 확신할 수 없으면 가중 모형 안에서도 강건 표준오차를 써야 합니다
# 이분산이 계수 자체를 바꾸는 경우도 있습니다
# 오차의 sd 가 x 에 비례하면 계수는 안 바뀝니다
# 무엇 기울기 참값
# 최소제곱 0.985686 1.0
# 그런데 y 를 로그로 바꾸면 재는 대상이 바뀝니다
# 무엇을 회귀 계수 무엇의 변화
# y 를 x 로 1.064433 산술평균
# log y 를 x 로 0.297531 기하평균의 로그
# 179강 문제 5 와 같은 이야기입니다. 변환은 물음을 바꿉니다
# 이분산을 없애려고 로그를 취하면 답하는 물음도 함께 바뀝니다
# 군집이 있으면 강건 표준오차로도 부족합니다
# 60 개 뭉치에서 뭉치당 20 명을 뽑습니다. 173강 문제 3 의 구조입니다
# 뭉치 안 상관 계수의 표준편차 보통 HC3 군집 강건
# 0.0 0.028219 0.028161 0.028237 0.027069
# 0.2 0.060118 0.028173 0.028173 0.057518
# 0.5 0.087775 0.027855 0.027701 0.083716
# 뭉치 안 상관이 커지면 보통도 HC3 도 참값보다 작아집니다
# HC3 은 관측 하나하나가 독립이라고 보므로 뭉치를 못 봅니다
# 군집 강건 표준오차는 뭉치를 하나로 묶어 계산해 참값에 붙습니다
# 무엇을 보고할지 정리합니다
# 상황 무엇을 쓰는가
# 아무것도 모름 HC3 을 기본값으로
# 표본이 아주 작음 붓스트랩이나 순열
# 분산 구조를 앎 가중최소제곱
# 뭉치가 있음 군집 강건
# 시계열 자기상관까지 강건
# 이 강의의 결론은 하나입니다. 계수는 그대로이고 표준오차만 고치면 됩니다
# 그리고 고치는 비용이 아주 싸므로 처음부터 고쳐 두는 것이 낫습니다