193강 문제 4에서 안 잰 교란이 그대로 남았습니다. 성향 점수도 회귀도 매칭도 근처의 같은 답을 냈습니다.
같은 대상을 두 번 재면 그 대상 고유의 것은 전후 차이에서 사라집니다. 안 쟀어도 사라집니다.
그런데 시간이 지나면 저절로 변하는 것도 있습니다. 그것은 처치를 안 받은 군의 전후 차이로 잽니다.
뺄셈을 두 번 합니다. 그것이 이름이며, 대신 평행 추세라는 가정 하나를 새로 집니다.
문제. 두 가지 단순한 비교가 각각 실패합니다.
(1) 전후 비교와 군 비교를 각각 해 보세요.
(2) 각각 무엇을 잘못 세는지 밝히세요.
(3) 두 뺄셈을 겹쳐 보세요.
생각의 실마리. 처치군은 가 큰 쪽에 몰려 있고 는 관측되지 않습니다. 시간이 지나면 두 군 모두 만큼 오르며, **참 효과는 **입니다.
풀이. (1) 네 개의 평균을 봅니다.
| 무엇 | 처치군 | 대조군 | 차이 |
|---|---|---|---|
| 이전 | |||
| 이후 |
(2) 한 가지씩만 보면 이렇게 됩니다.
| 어떻게 세는가 | 추정값 | 참값 | 치우침 |
|---|---|---|---|
| 처치군의 전후 차이 | |||
| 이후 시점의 군 차이 | |||
| 이전 시점의 군 차이 |
전후 차이는 시간 추세 를 효과로 잘못 셉니다. 치우침 이 그것입니다.
군 차이는 로 생긴 격차를 효과로 잘못 셉니다. 치우침 이 그것입니다.
마지막 줄이 열쇠입니다. 처치가 시작되기 전인데도 두 군이 만큼 벌어져 있으며, 그것이 처치와 무관한 격차의 크기입니다.
(3) 두 뺄셈을 겹칩니다.
| 무엇 | 값 | 무엇을 지우는가 |
|---|---|---|
| 처치군의 전후 차이 | 군 고유 수준 | |
| 대조군의 전후 차이 | 시간 추세 | |
| 두 차이의 차이 | 둘 다 |
이중차분 추정값 이고 참값 입니다. 치우침 입니다.
를 한 번도 안 썼는데 지워졌습니다. 시간에 안 변하기 때문입니다.
이 문제에서 배우는 것. 첫 뺄셈과 둘째 뺄셈이 지우는 것이 서로 다릅니다. 전후 차이는 그 대상에 붙어 있는 모든 것을 지우고, 대조군의 전후 차이는 모두에게 공통으로 일어난 변화를 지웁니다. 그래서 안 잰 변수가 아무리 많아도 시간에 안 변하기만 하면 첫 뺄셈이 처리합니다. 193강이 변수를 하나하나 재서 맞추려 했다면, 194강은 재지 않고 빼 버립니다. 대신 새 가정이 하나 붙는데, 그것이 문제 3입니다.
바로 확인 1.
확인 1-1. 이중차분의 식을 쓰세요.
답. 처치군의 전후 차이에서 대조군의 전후 차이를 뺍니다.
확인 1-2. 검산에서 처치 전 두 군의 격차를 쓰세요.
답. 입니다.
확인 1-3. 검산에서 이중차분 추정값과 치우침을 쓰세요.
답. 과 입니다.
문제. 같은 계산을 회귀로 합니다.
(1) 상호작용항 회귀로 쓰세요.
(2) 각 계수가 무엇을 뜻하는지 밝히세요.
(3) 표준오차를 검사하세요.
생각의 실마리. 네 평균의 조합은 더미 두 개와 그 곱을 넣은 회귀와 같습니다. 186강 문제 3의 상호작용항입니다.
풀이. (1)과 (2) 를 군 표시와 시점 표시와 그 곱에 회귀합니다.
| 항 | 추정값 | 표준오차 | 무엇을 뜻하는가 |
|---|---|---|---|
| 절편 | 대조군의 이전 수준 | ||
| 군 표시 | 군 고유 격차 | ||
| 시점 표시 | 시간 추세 | ||
| 군 곱하기 시점 | 이중차분 효과 |
곱 항의 계수 이 문제 1의 네 평균으로 구한 값과 똑같습니다.
군 표시의 계수 가 처치 전 격차와 같습니다. 회귀가 그 격차를 따로 담아 두므로 곱 항에서 빠집니다.
회귀로 쓰면 공변량을 더 넣을 수 있고 표준오차가 따라 나옵니다.
(3) 그런데 그 표준오차는 대개 틀립니다. 같은 사람을 두 번 재면 두 관측이 이어져 있기 때문입니다.
| 표준오차 계산 | 평균 | 실제 흔들림 | 포함률 |
|---|---|---|---|
| 보통 방식 | |||
| 사람 단위 군집 |
보통 방식이 실제 흔들림의 다섯 배를 넘게 잡아 포함률이 이 됩니다.
같은 사람의 두 관측에 공통된 부분이 차분에서는 사라지는데 보통 방식은 그것을 잔차에 그대로 남겨 두기 때문입니다.
군집 방식이 로 실제 흔들림 에 붙고 포함률도 가 됩니다.
방향이 반대인 경우도 있습니다. 처치가 군집 수준으로 주어지면 군집 상관이 표준오차를 작게 만들어 오류율이 오릅니다.
이 문제에서 배우는 것. 이중차분 논문에서 표준오차가 가장 흔한 결함입니다. 여기서는 보통 방식이 지나치게 커서 안전한 쪽으로 틀렸지만, 처치가 지역이나 회사 단위로 주어지는 실제 자료에서는 반대 방향입니다. 같은 지역의 사람들이 함께 오르내리는데 그것을 독립으로 세면, 실제로는 지역 수만큼의 정보밖에 없는데 사람 수만큼 있다고 세는 셈입니다. 군집의 개수가 표본 크기라는 것이 요점이며, 지역이 다섯 곳이면 표본은 다섯입니다. 188강 문제 4의 강건 표준오차가 여기서 군집 단위로 확장됩니다.
바로 확인 2.
확인 2-1. 검산에서 네 계수를 쓰세요.
답. , , , 입니다.
확인 2-2. 검산에서 두 표준오차와 실제 흔들림을 쓰세요.
답. 과 이며 실제 흔들림은 입니다.
확인 2-3. 검산에서 두 포함률을 쓰세요.
답. 과 입니다.
문제. 가정을 확인합니다.
(1) 추세가 어긋나면 어떻게 되는지 재세요.
(2) 가정을 검사하는 방법을 만드세요.
(3) 무엇을 봐야 하는지 정리하세요.
생각의 실마리. 이중차분이 기대는 것은 하나입니다. 처치가 없었다면 두 군이 같은 만큼 변했을 것이라는 가정입니다.
풀이. (1) 추세를 어긋나게 해 봅니다.
| 자료 생성 | 추정값 | 참값 | 치우침 |
|---|---|---|---|
| 추세가 같음 | |||
| 처치군 추세가 빠름 | |||
| 처치군 추세가 빠름 | |||
| 처치군 추세가 느림 |
추세가 어긋난 만큼 그대로 치우칩니다. 어긋나면 , 어긋나면 입니다.
다른 오차원이 없습니다. 가정이 깨지면 표본을 늘려도 안 낫고, 191강 문제 3과 같습니다.
(2) 처치 전 시점이 여럿이면 검사할 수 있습니다. 처치 전 네 시점과 처치 후 세 시점을 봅니다.
| 시점 | 추세가 같은 자료 | 추세가 어긋난 자료 | 처치 시점인가 |
|---|---|---|---|
| 아니오 | |||
| 아니오 | |||
| 아니오 | |||
| 아니오 | |||
| 예 | |||
| 예 | |||
| 예 |
기준은 시점이고 그 시점을 으로 두고 봅니다.
왼쪽 자료는 처치 전 네 값이 안쪽에 있고 처치 후에 으로 뜁니다.
오른쪽 자료는 처치 전부터 , , 로 이미 기울어져 있습니다. 가정이 의심됩니다.
두 자료의 처치 후 값은 과 으로 비슷한데 처치 전이 다릅니다. 판정이 거기서 갈립니다.
(3) 이것을 사건 연구 그림이라 하며, 처치 전 계수가 핵심입니다.
처치 전이 평평하다는 것이 가정의 증명은 아닙니다. 처치 직후에 추세가 꺾였을 수도 있고, 검정력이 낮아 못 잡았을 수도 있습니다.
이 문제에서 배우는 것. 평행 추세는 검정할 수 있는 것이 아니라 반증만 할 수 있는 가정입니다. 처치 전이 평평하면 "아직 반증되지 않았다"는 뜻이고, 기울어져 있으면 "반증됐다"는 뜻입니다. 그런데 실무에서는 처치 전이 평평하게 나올 때까지 시점 범위를 조정하는 일이 생기는데, 그러면 189강 문제 3의 선택 후 추론이 됩니다. 처치 전 시점 범위를 미리 정하고 등록하는 것이 대응이며, 192강 문제 5의 사전 등록과 같은 원리입니다.
바로 확인 3.
확인 3-1. 평행 추세 가정을 한 문장으로 쓰세요.
답. 처치가 없었다면 두 군이 같은 만큼 변했을 것이라는 가정입니다.
확인 3-2. 검산에서 추세가 어긋날 때의 치우침을 쓰세요.
답. 입니다.
확인 3-3. 검산에서 어긋난 자료의 처치 전 세 값을 쓰세요.
답. , , 입니다.
문제. 세 가지 실패를 봅니다.
(1) 평균 회귀를 보이세요.
(2) 구성이 바뀔 때를 보세요.
(3) 처치가 번질 때를 보세요.
생각의 실마리. 평행 추세만 지키면 되는 것이 아닙니다. 가정이 성립하는 것처럼 보이는데도 깨지는 자리가 있습니다.
풀이. (1) 첫째는 평균 회귀입니다. 참 효과는 인데 이전 값이 낮은 퍼센트를 처치군으로 고릅니다.
| 무엇 | 값 |
|---|---|
| 처치군의 전후 차이 | |
| 대조군의 전후 차이 | |
| 이중차분 추정값 | |
| 참 효과 |
가 나옵니다. 효과가 하나도 없는데 그렇습니다.
결과값을 보고 고른 것이 원인입니다. 낮게 나온 사람은 다음에 저절로 올라가고, 높게 나온 사람은 저절로 내려갑니다.
191강 문제 4의 선택편향이 시간축에서 나타난 모습이며, "성적이 나쁜 학교에 지원했더니 좋아졌다" 같은 결론이 여기서 나옵니다.
처치 대상을 결과값으로 고르지 않았는지가 첫 질문입니다.
(2) 둘째는 구성이 바뀌는 것입니다. 이후 시점에서만 사람이 빠집니다.
| 누가 빠지는가 | 추정값 | 참값 | 치우침 |
|---|---|---|---|
| 아무도 안 빠짐 | |||
| 무작위로 퍼센트 | |||
| 처치군에서 낮은 사람이 | |||
| 대조군에서 높은 사람이 |
무작위로 빠지면 로 괜찮습니다.
를 따라 빠지면 넘게 치우칩니다. 두 시점의 사람이 달라졌기 때문입니다.
같은 사람을 두 번 따라가면 이 문제가 사라집니다. 시점마다 다른 표본을 쓰는 자료에서 특히 위험합니다.
(3) 셋째는 처치가 대조군에도 번지는 것입니다.
| 번짐의 크기 | 추정값 | 참 효과 | 치우침 |
|---|---|---|---|
대조군이 덩달아 좋아지면 차이가 줄어 효과를 작게 봅니다.
번짐이 이면 로 효과가 절반 아래로 보입니다. 있는데 없어 보이는 쪽이며, 177강 문제 5의 간섭 없음 가정이 깨진 것입니다.
이 문제에서 배우는 것. 세 실패가 서로 다른 방향으로 틉니다. 평균 회귀와 구성 변화는 없는 효과를 만들거나 부풀리고, 번짐은 있는 효과를 지웁니다. 그래서 "이중차분은 보수적이다" 같은 일반화가 안 됩니다. 특히 번짐은 가장 자주 무시되면서 가장 자연스럽게 일어납니다. 이웃 지역에 새 정책이 생기면 사람이 옮겨 가고, 경쟁사가 가격을 내리면 같이 내립니다. 대조군을 멀리 고르면 번짐이 줄지만 평행 추세가 위태로워지므로, 두 가정이 서로 반대 방향으로 대조군 선택을 당깁니다.
바로 확인 4.
확인 4-1. 검산에서 평균 회귀가 만든 가짜 효과를 쓰세요.
답. 참 효과가 인데 가 나옵니다.
확인 4-2. 검산에서 를 따라 빠질 때의 두 치우침을 쓰세요.
답. 과 입니다.
확인 4-3. 검산에서 번짐이 일 때의 추정값을 쓰세요.
답. 로 참값 의 절반 아래입니다.
문제. 절차를 세웁니다.
(1) 대조군 고르는 방법을 정리하세요.
(2) 합성 대조군을 만들어 보세요.
(3) 가짜 처치 검정을 하세요.
생각의 실마리. 이중차분의 품질은 계산이 아니라 대조군이 정합니다.
풀이. (1) 네 가지 방법입니다.
| 어떻게 고르는가 | 언제 쓰는가 | 무엇을 조심하는가 |
|---|---|---|
| 자연스러운 비교군 | 제도가 일부에만 적용 | 적용 이유가 결과와 무관한가 |
| 성향 점수로 고름 | 특성이 크게 다름 | 193강의 겹침 문제 |
| 합성 대조군 | 처치 단위가 하나 | 처치 전 적합의 과적합 |
| 이웃한 지역 | 경계가 뚜렷함 | 번짐이 가장 심한 자리 |
셋째 줄이 처치 단위가 하나일 때 쓰입니다. 한 나라, 한 도시에 정책이 생긴 경우이며, 여러 대조군을 섞어 가상의 대조군을 만듭니다.
(2) 합성 대조군을 흉내 내 봅니다. 처치 단위 하나와 대조 후보 개이고 시점부터 처치이며, **참 효과는 **입니다.
| 무엇을 대조로 | 처치 전 오차 | 처치 후 추정 효과 |
|---|---|---|
| 단순 평균 | ||
| 합성 대조군 |
처치 전 오차가 에서 로 줄고 추정도 에서 로 옵니다.
그래도 참값 과 차이가 납니다. 처치 전 시점으로 개의 가중치를 맞췄기 때문입니다.
맞출 시점보다 후보가 많으면 과적합합니다. 189강 문제 3과 같은 이야기이며, 처치 전 시점이 많아야 쓸 수 있는 방법입니다.
(3) 절차를 정리합니다.
| 단계 | 무엇을 확인하는가 |
|---|---|
| 처치 시점 확정 | 언제부터 누구에게 적용됐는가 |
| 대조군 고르기 | 왜 그 군이 비교 가능한가 |
| 처치 전 추세 검사 | 사건 연구 그림에서 평평한가 |
| 표준오차 | 군집 단위로 계산했는가 |
| 구성 변화 | 두 시점의 사람이 같은가 |
| 번짐 | 대조군이 영향을 받는가 |
| 가짜 처치 검정 | 일어나지 않은 시점에서 인가 |
마지막 줄을 해 봅니다. 진짜 처치는 시점에서 일어납니다.
| 어느 시점을 처치로 두는가 | 추정값 | 있어야 하는 값 | 판정 |
|---|---|---|---|
| 시점 | 가짜 | ||
| 시점 | 가짜 | ||
| 시점 | 진짜 | ||
| 시점 | 처치 후 |
진짜 시점인 에서만 이 나오고 나머지 세 곳은 근처입니다.
마지막 줄은 이미 처치가 시작된 뒤라 새로 오르는 것이 없습니다.
가짜 시점에서 효과가 나오면 평행 추세를 의심해야 합니다.
이 문제에서 배우는 것. 가짜 처치 검정이 사건 연구 그림과 같은 것을 다르게 보여 줍니다. 사건 연구가 처치 전 계수를 늘어놓는다면, 가짜 처치 검정은 아무 일도 없었던 시점에 이중차분을 그대로 적용해 이 나오는지 봅니다. 방법이 자료에 대해 거짓 양성을 내지 않는다는 확인이며, 179강 문제 3의 순열검정과 발상이 같습니다. 참값을 모르는 자리에서 참값을 아는 자리를 만들어 방법을 검사하는 것이 관측 연구의 기본 무기입니다.
바로 확인 5.
확인 5-1. 합성 대조군을 언제 쓰는지 쓰세요.
답. 처치 단위가 하나여서 자연스러운 대조군이 없을 때 씁니다.
확인 5-2. 검산에서 두 대조 방식의 처치 전 오차와 추정 효과를 쓰세요.
답. 와 , 와 입니다.
확인 5-3. 검산에서 가짜 처치 검정의 네 값을 쓰세요.
답. , , , 입니다.
| 무엇을 지우는가 | 어느 뺄셈이 |
|---|---|
| 대상 고유의 것 | 전후 차이 |
| 모두에게 공통인 변화 | 대조군의 전후 차이 |
| 시간에 따라 변하는 대상별 요인 | 어느 것도 못 지웁니다 |
| 가정 | 깨지는 자리 |
|---|---|
| 평행 추세 | 두 군의 추세가 다름 |
| 결과와 무관한 선택 | 평균 회귀 |
| 같은 구성 | 표본이 시점마다 다름 |
| 간섭 없음 | 대조군에 번짐 |
| 검사 | 어떻게 |
|---|---|
| 사건 연구 | 처치 전 계수가 평평한가 |
| 가짜 처치 | 다른 시점에서 인가 |
| 대조군 바꾸기 | 결과가 유지되는가 |
| 결과 바꾸기 | 영향 없어야 할 지표는 인가 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 보통 표준오차를 씁니다 | 군집 단위로 계산합니다 |
| 처치 전 한 시점만 봅니다 | 여러 시점으로 추세를 봅니다 |
| 나쁜 쪽을 골라 처치합니다 | 평균 회귀를 의심합니다 |
| 이웃을 대조군으로 씁니다 | 번짐을 확인합니다 |
| 처치 전이 평평하면 안심합니다 | 반증 못 한 것일 뿐입니다 |
문제 6. 이중차분의 식을 쓰세요.
답. 처치군의 전후 차이에서 대조군의 전후 차이를 뺍니다.
문제 7. 검산에서 처치 전 두 군의 격차를 쓰세요.
답. 입니다.
문제 8. 검산에서 이중차분 추정값과 치우침을 쓰세요.
답. 과 입니다.
문제 9. 검산에서 회귀의 네 계수를 쓰세요.
답. , , , 입니다.
문제 10. 검산에서 두 표준오차와 실제 흔들림을 쓰세요.
답. 과 이며 실제 흔들림은 입니다.
문제 11. 검산에서 두 포함률을 쓰세요.
답. 과 입니다.
문제 12. 검산에서 추세가 어긋날 때의 치우침을 쓰세요.
답. 입니다.
문제 13. 검산에서 어긋난 자료의 처치 전 세 값을 쓰세요.
답. , , 입니다.
문제 14. 검산에서 평균 회귀가 만든 가짜 효과를 쓰세요.
답. 참 효과가 인데 가 나옵니다.
문제 15. 검산에서 를 따라 빠질 때의 두 치우침을 쓰세요.
답. 과 입니다.
문제 16. 검산에서 번짐이 일 때의 추정값을 쓰세요.
답. 입니다.
문제 17. 검산에서 두 대조 방식의 처치 전 오차를 쓰세요.
답. 와 입니다.
문제 18. 검산에서 가짜 처치 검정의 네 값을 쓰세요.
답. , , , 입니다.
심화 1. 시점이 여럿이고 처치 시작도 다를 때를 정리하세요.
여러 단위가 서로 다른 시점에 처치를 받는 자료가 실무에서 흔합니다. 주마다 법이 다른 해에 시행되는 경우입니다.
이때 흔히 쓰던 이원 고정효과 회귀에 문제가 있다는 것이 최근 밝혀졌습니다.
| 무엇이 문제인가 | 왜 |
|---|---|
| 먼저 처치받은 단위가 대조군이 됨 | 이미 효과가 있는 군을 기준으로 씀 |
| 효과가 시간에 따라 변하면 | 그 변화가 음수 가중치로 들어감 |
| 전체 추정값이 | 개별 효과의 볼록결합이 아님 |
모든 개별 효과가 양수인데 전체 추정값이 음수가 나오는 일이 실제로 가능합니다.
대응은 아직 처치받지 않은 단위만 대조군으로 쓰는 것이며, 여러 추정량이 제안돼 있습니다.
옛 논문의 결론이 이 이유로 뒤집힌 사례가 많습니다. 방법이 바뀌면 결론이 바뀌는 자리이므로 확인이 필요합니다.
심화 2. 삼중차분을 정리하세요.
뺄셈을 한 번 더 합니다.
| 무엇이 필요한가 | 왜 |
|---|---|
| 처치받는 군과 안 받는 군 | 첫째 차분 |
| 처치 전과 후 | 둘째 차분 |
| 영향받는 집단과 아닌 집단 | 셋째 차분 |
한 주에서 특정 연령대에만 적용되는 정책이 예입니다. 다른 연령대가 셋째 차원의 대조군이 됩니다.
이렇게 하면 주별 시간 추세가 지워집니다. 평행 추세 가정이 집단 간 차이에 대해서만 필요해집니다.
대신 표준오차가 커집니다. 뺄셈마다 분산이 더해지므로, 정보를 사서 가정을 파는 셈입니다.
심화 3. 결과가 이진일 때를 정리하세요.
190강 문제 5의 물음이 여기서 다시 나옵니다.
| 방법 | 이중차분이 되는가 |
|---|---|
| 선형확률모형 | 계수가 곧 확률 차이 |
| 로지스틱 | 계수 차이가 이중차분이 아님 |
로지스틱에서 상호작용항 계수가 이중차분을 뜻하지 않습니다. 비선형이라 차이의 차이가 계수의 차이와 다릅니다.
190강 문제 3의 평균 한계효과를 시점별로 계산해 빼는 것이 맞는 방법입니다.
실무에서 이 실수가 흔하며, 로지스틱 상호작용항의 부호마저 참 이중차분과 반대일 수 있습니다.
심화 4. 이 방법이 답하는 물음을 정리하세요.
| 무엇을 재는가 | 누구에 대해 |
|---|---|
| 처치군의 처치효과 | 실제로 처치받은 군 |
| 그 시점의 효과 | 관측한 기간 |
| 그 규모의 처치 | 실제 적용된 강도 |
191강 문제 1의 ATT입니다. 대조군이 처치를 받았다면 어땠을지는 말하지 않습니다.
기간이 짧으면 단기 효과만 잽니다. 장기에 뒤집히는 정책이 흔하므로 기간을 밝혀야 합니다.
규모를 키웠을 때도 같은 효과일지는 다른 물음입니다. 시범사업이 전면 시행에서 실패하는 이유가 여기 있습니다.
심화 5. 이중차분과 성향 점수를 함께 쓰는 법을 정리하세요.
| 순서 | 무엇을 함 |
|---|---|
| 처치 전 특성으로 성향 점수 | 193강 |
| 비슷한 대조군을 고름 | 매칭이나 가중 |
| 그 위에서 이중차분 | 194강 |
첫 단계가 평행 추세를 더 그럴듯하게 만듭니다. 비슷한 대상끼리는 추세도 비슷할 가능성이 큽니다.
반드시 처치 전 변수만 써야 합니다. 처치 후 변수로 짝을 지으면 185강 문제 5의 넷째 줄 실수가 됩니다.
그런데 처치 전 결과값으로 짝을 지으면 평균 회귀가 생깁니다. 문제 4의 첫 표가 그것이며, 처치 전 추세로 짝을 짓는 편이 안전합니다.
심화 6. 이 강의가 남긴 문제를 정리하세요.
시간에 따라 변하는 교란은 이중차분도 못 지웁니다.
| 어떤 교란 | 이중차분이 지우는가 |
|---|---|
| 시간에 안 변하는 것 | 지웁니다 |
| 모두에게 공통인 시간 변화 | 지웁니다 |
| 군마다 다른 시간 변화 | 못 지웁니다 |
셋째 줄이 평행 추세를 깨는 것 그 자체입니다.
처치와는 이어져 있는데 결과와는 처치를 통해서만 이어진 변수가 있으면, 그것으로 효과를 끄집어낼 수 있습니다. 192강 문제 4의 배정이 그런 변수였으며, 195강은 그 발상을 일반화합니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| DID | 이중차분 | 두 차이의 차이입니다 |
| 군 표시 | 처치군이면 입니다 | |
| 시점 표시 | 이후 시점이면 입니다 | |
| 상호작용항 | 그 계수가 효과입니다 | |
| 평행 추세 | parallel trends | 처치가 없었다면 같이 변했을 것입니다 |
| 사건 연구 | event study | 시점별 계수를 늘어놓은 그림입니다 |
| 군집 표준오차 | clustered SE | 묶인 관측을 반영합니다 |
| 평균 회귀 | regression to the mean | 극단값이 저절로 돌아옵니다 |
| 번짐 | spillover | 처치가 대조군에 미칩니다 |
| 합성 대조군 | synthetic control | 여러 대조를 섞어 만듭니다 |
| 가짜 처치 검정 | placebo test | 없는 시점에서 인지 봅니다 |
| 삼중차분 | DDD | 뺄셈을 한 번 더 합니다 |
다음은 195강 도구변수입니다. 이 강의가 시간을 지렛대로 썼습니다.
문제 4에서 시간에 따라 변하는 교란이 남았습니다. 192강 문제 4에서는 무작위 배정을 지렛대로 순응자의 효과를 끄집어냈는데, 그 발상을 일반화하면 자연에 이미 있는 무작위를 쓸 수 있습니다. 195강은 그 조건과 대가를 다룹니다.
import numpy as np
rng = np.random.default_rng(20261001)
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 ols(y, X):
A = np.concatenate([np.ones((len(y), 1)), X], axis=1)
b, *_ = np.linalg.lstsq(A, y, rcond=None)
r = y - A @ b
s2 = float(r @ r) / (len(y) - A.shape[1])
V = s2 * np.linalg.inv(A.T @ A)
return b, np.sqrt(np.diag(V))
# --- 문제 1: 전후 비교와 군 비교가 각각 실패합니다 ----------------------
print(" 193강 문제 4 에서 못 잰 교란이 그대로 남았습니다")
print(" 그 교란이 시간에 안 변한다면 뺄셈으로 지울 수 있습니다")
N1 = 3000
u1 = rng.normal(0, 1, N1)
g1 = (u1 + rng.normal(0, 0.5, N1) > 0).astype(float)
trend = 1.5
eff = 2.0
y1_pre = 5.0 + 3.0 * u1 + rng.normal(0, 1.0, N1)
y1_post = 5.0 + trend + 3.0 * u1 + eff * g1 + rng.normal(0, 1.0, N1)
print(" 처치군은 u 가 큰 쪽에 몰려 있고 u 는 관측되지 않습니다")
print(" 시간이 지나면 두 군 모두 %.1f 만큼 오릅니다. 참 효과는 %.1f 입니다"
% (trend, eff))
print(" %s %s %s %s" % (pw("무엇", 20), rw("처치군", 14), rw("대조군", 14),
rw("차이", 14)))
for nm, a, b in [("이전", y1_pre[g1 == 1], y1_pre[g1 == 0]),
("이후", y1_post[g1 == 1], y1_post[g1 == 0])]:
print(" %s %14.6f %14.6f %14.6f"
% (pw(nm, 20), float(a.mean()), float(b.mean()),
float(a.mean() - b.mean())))
pre_t = float(y1_pre[g1 == 1].mean())
post_t = float(y1_post[g1 == 1].mean())
pre_c = float(y1_pre[g1 == 0].mean())
post_c = float(y1_post[g1 == 0].mean())
print(" 한 가지씩만 보면 어떻게 되는지 봅니다")
print(" %s %s %s %s" % (pw("어떻게 세는가", 26), rw("추정값", 14),
rw("참값", 10), rw("치우침", 12)))
for nm, v in [("처치군의 전후 차이", post_t - pre_t),
("이후 시점의 군 차이", post_t - post_c),
("이전 시점의 군 차이", pre_t - pre_c)]:
print(" %s %14.6f %10.1f %12.6f" % (pw(nm, 26), v, eff, v - eff))
print(" 전후 차이는 시간 추세 %.1f 를 효과로 잘못 셉니다" % trend)
print(" 군 차이는 u 로 생긴 격차를 효과로 잘못 셉니다")
print(" 마지막 줄이 열쇠입니다. 처치 전인데도 %.4f 만큼 벌어져 있습니다"
% (pre_t - pre_c))
print(" 두 뺄셈을 겹치면 둘 다 사라집니다")
did = (post_t - pre_t) - (post_c - pre_c)
print(" %s %s %s" % (pw("무엇", 26), rw("값", 14), rw("무엇을 지우는가", 20)))
for nm, v, w in [("처치군의 전후 차이", post_t - pre_t, "군 고유 수준"),
("대조군의 전후 차이", post_c - pre_c, "시간 추세"),
("두 차이의 차이", did, "둘 다")]:
print(" %s %14.6f %s" % (pw(nm, 26), v, rw(w, 20)))
print(" 이중차분 추정값 %.6f 이고 참값 %.1f 입니다. 치우침 %.6f 입니다"
% (did, eff, did - eff))
print(" u 를 한 번도 안 썼는데 지워졌습니다. 시간에 안 변하기 때문입니다")
# --- 문제 2: 회귀로 쓰는 법 ---------------------------------------------
print(" 이중차분은 상호작용항 하나짜리 회귀입니다")
y2 = np.concatenate([y1_pre, y1_post])
gg = np.concatenate([g1, g1])
tt = np.concatenate([np.zeros(N1), np.ones(N1)])
b2, se2 = ols(y2, np.stack([gg, tt, gg * tt], axis=1))
print(" y 를 군 표시와 시점 표시와 그 곱에 회귀합니다")
print(" %s %s %s %s" % (pw("항", 20), rw("추정값", 14), rw("표준오차", 12),
rw("무엇을 뜻하는가", 22)))
for nm, i, w in [("절편", 0, "대조군의 이전 수준"), ("군 표시", 1, "군 고유 격차"),
("시점 표시", 2, "시간 추세"), ("군 곱하기 시점", 3, "이중차분 효과")]:
print(" %s %14.6f %12.6f %s" % (pw(nm, 20), b2[i], se2[i], rw(w, 22)))
print(" 곱 항의 계수 %.6f 이 앞의 네 평균으로 구한 값과 같습니다" % b2[3])
print(" 회귀로 쓰면 공변량을 더 넣을 수 있고 표준오차가 따라 나옵니다")
print(" 그런데 이 표준오차는 대개 틀립니다")
print(" 같은 사람을 두 번 재면 두 관측이 이어져 있습니다")
S = 2000
naive_cov, clu_cov = 0, 0
naive_se, clu_se, est = [], [], []
for _ in range(S):
n = 300
uu = rng.normal(0, 1, n)
ggg = (uu > 0).astype(float)
a_i = rng.normal(0, 2.0, n)
yp = 5.0 + 3.0 * uu + a_i + rng.normal(0, 0.5, n)
yq = 5.0 + 1.5 + 3.0 * uu + a_i + 2.0 * ggg + rng.normal(0, 0.5, n)
yv = np.concatenate([yp, yq])
G = np.concatenate([ggg, ggg])
T = np.concatenate([np.zeros(n), np.ones(n)])
X = np.stack([G, T, G * T], axis=1)
bb, ss = ols(yv, X)
A = np.concatenate([np.ones((2 * n, 1)), X], axis=1)
r = yv - A @ bb
XtXi = np.linalg.inv(A.T @ A)
meat = np.zeros((4, 4))
for i in range(n):
Ai = A[[i, i + n], :]
ri = r[[i, i + n]]
v = Ai.T @ ri
meat += np.outer(v, v)
Vc = XtXi @ meat @ XtXi
sc = float(np.sqrt(Vc[3, 3]))
est.append(bb[3])
naive_se.append(ss[3])
clu_se.append(sc)
if abs(bb[3] - 2.0) < 1.96 * ss[3]:
naive_cov += 1
if abs(bb[3] - 2.0) < 1.96 * sc:
clu_cov += 1
print(" %s %s %s %s" % (pw("표준오차 계산", 22), rw("평균", 14),
rw("실제 흔들림", 14), rw("포함률", 12)))
sd_est = float(np.std(est, ddof=1))
print(" %s %14.6f %14.6f %12.4f"
% (pw("보통 방식", 22), float(np.mean(naive_se)), sd_est, naive_cov / S))
print(" %s %14.6f %14.6f %12.4f"
% (pw("사람 단위 군집", 22), float(np.mean(clu_se)), sd_est, clu_cov / S))
print(" 보통 방식이 실제 흔들림의 다섯 배를 넘게 잡아 포함률이 1.0 이 됩니다")
print(" 같은 사람의 두 관측에 공통된 부분이 차분에서는 사라지는데")
print(" 보통 방식은 그것을 잔차에 그대로 남겨 두기 때문입니다")
print(" 군집 방식이 실제 흔들림에 붙고 포함률도 목표에 닿습니다")
print(" 방향이 반대인 경우도 있습니다. 처치가 군집 수준이면 반대로 작아집니다")
print(" 188강 문제 4 의 강건 표준오차가 여기서는 군집 단위로 확장됩니다")
# --- 문제 3: 평행 추세 가정 --------------------------------------------
print(" 이중차분이 기대는 것은 평행 추세 하나입니다")
print(" 처치가 없었다면 두 군이 같은 만큼 변했을 것이라는 가정입니다")
N3 = 3000
u3 = rng.normal(0, 1, N3)
g3 = (u3 + rng.normal(0, 0.5, N3) > 0).astype(float)
print(" %s %s %s %s" % (pw("자료 생성", 26), rw("추정값", 14), rw("참값", 10),
rw("치우침", 12)))
for nm, extra in [("추세가 같음", 0.0), ("처치군 추세가 0.5 빠름", 0.5),
("처치군 추세가 1.0 빠름", 1.0),
("처치군 추세가 0.5 느림", -0.5)]:
yp = 5.0 + 3.0 * u3 + rng.normal(0, 1.0, N3)
yq = (5.0 + 1.5 + 3.0 * u3 + 2.0 * g3 + extra * g3
+ rng.normal(0, 1.0, N3))
d = (float(yq[g3 == 1].mean() - yp[g3 == 1].mean())
- float(yq[g3 == 0].mean() - yp[g3 == 0].mean()))
print(" %s %14.6f %10.1f %12.6f" % (pw(nm, 26), d, 2.0, d - 2.0))
print(" 추세가 어긋난 만큼 그대로 치우칩니다. 다른 오차원이 없습니다")
print(" 가정이 깨지면 표본을 늘려도 안 낫습니다. 191강 문제 3 과 같습니다")
print(" 처치 전 시점이 여럿이면 가정을 검사할 수 있습니다")
N4 = 4000
u4 = rng.normal(0, 1, N4)
g4 = (u4 + rng.normal(0, 0.5, N4) > 0).astype(float)
print(" 처치 전 네 시점과 처치 후 세 시점을 봅니다")
print(" %s %s %s %s"
% (pw("시점", 10), rw("추세가 같은 자료", 20),
rw("추세가 어긋난 자료", 20), rw("처치 시점인가", 16)))
ks = list(range(-4, 3))
das, dbs = [], []
for k in ks:
ya = 5.0 + 0.4 * k + 3.0 * u4 + (2.0 * g4 if k >= 0 else 0.0) \
+ rng.normal(0, 1.0, N4)
yb = 5.0 + 0.4 * k + 3.0 * u4 + 0.3 * k * g4 \
+ (2.0 * g4 if k >= 0 else 0.0) + rng.normal(0, 1.0, N4)
das.append(float(ya[g4 == 1].mean() - ya[g4 == 0].mean()))
dbs.append(float(yb[g4 == 1].mean() - yb[g4 == 0].mean()))
base = das[ks.index(-1)]
base2 = dbs[ks.index(-1)]
for k, da, db in zip(ks, das, dbs):
print(" %s %20.6f %20.6f %s"
% (pw("%d" % k, 10), da - base, db - base2,
rw("예" if k >= 0 else "아니오", 16)))
print(" 기준은 -1 시점이고 그 시점을 0 으로 두고 봅니다")
print(" 왼쪽 자료는 처치 전 네 값이 0 근처이고 처치 후에 2.0 으로 뜁니다")
print(" 오른쪽 자료는 처치 전부터 이미 기울어져 있습니다. 가정이 의심됩니다")
print(" 두 자료의 처치 후 값은 비슷한데 처치 전이 다릅니다. 거기서 갈립니다")
print(" 이것을 사건 연구 그림이라 합니다. 처치 전 계수가 핵심입니다")
# --- 문제 4: 무엇이 이 방법을 깨뜨리는가 --------------------------------
print(" 평행 추세 말고도 깨지는 자리가 있습니다")
print(" 첫째는 평균 회귀입니다. 나쁜 시점을 골라 처치하면 저절로 좋아집니다")
N5 = 4000
lev = rng.normal(0, 1, N5)
yp5 = lev + rng.normal(0, 1.5, N5)
yq5 = lev + rng.normal(0, 1.5, N5)
sel = (yp5 < np.quantile(yp5, 0.3)).astype(float)
d5 = (float(yq5[sel == 1].mean() - yp5[sel == 1].mean())
- float(yq5[sel == 0].mean() - yp5[sel == 0].mean()))
print(" 참 효과는 0 인데 이전 값이 낮은 30 퍼센트를 처치군으로 고릅니다")
print(" %s %s" % (pw("무엇", 26), rw("값", 14)))
for nm, v in [("처치군의 전후 차이", float(yq5[sel == 1].mean() - yp5[sel == 1].mean())),
("대조군의 전후 차이", float(yq5[sel == 0].mean() - yp5[sel == 0].mean())),
("이중차분 추정값", d5), ("참 효과", 0.0)]:
print(" %s %14.6f" % (pw(nm, 26), v))
print(" %.6f 이 나옵니다. 결과값을 보고 고른 것이 원인입니다" % d5)
print(" 191강 문제 4 의 선택편향이 시간축에서 나타난 모습입니다")
print(" 처치 대상을 결과값으로 고르지 않았는지가 첫 질문입니다")
print(" 둘째는 구성이 바뀌는 것입니다")
N6 = 4000
u6 = rng.normal(0, 1, N6)
g6 = (u6 + rng.normal(0, 0.5, N6) > 0).astype(float)
print(" %s %s %s %s"
% (pw("누가 빠지는가", 30), rw("추정값", 14), rw("참값", 10), rw("치우침", 12)))
for nm, mode in [("아무도 안 빠짐", 0), ("무작위로 20 퍼센트", 1),
("처치군에서 u 낮은 사람이", 2), ("대조군에서 u 높은 사람이", 3)]:
yp = 5.0 + 3.0 * u6 + rng.normal(0, 1.0, N6)
yq = 5.0 + 1.5 + 3.0 * u6 + 2.0 * g6 + rng.normal(0, 1.0, N6)
keep = np.ones(N6, dtype=bool)
if mode == 1:
keep = rng.random(N6) > 0.2
elif mode == 2:
keep = ~((g6 == 1) & (u6 < np.quantile(u6[g6 == 1], 0.4)))
elif mode == 3:
keep = ~((g6 == 0) & (u6 > np.quantile(u6[g6 == 0], 0.6)))
gk, ypk, yqk = g6[keep], yp[keep], yq[keep]
d = (float(yqk[gk == 1].mean() - yp[g6 == 1].mean())
- float(yqk[gk == 0].mean() - yp[g6 == 0].mean()))
print(" %s %14.6f %10.1f %12.6f" % (pw(nm, 30), d, 2.0, d - 2.0))
print(" 이후 시점에서만 빠지면 두 시점의 사람이 달라집니다")
print(" 무작위로 빠지면 괜찮지만 u 를 따라 빠지면 크게 치우칩니다")
print(" 같은 사람을 두 번 따라가면 이 문제가 사라집니다")
print(" 셋째는 처치가 대조군에도 번지는 것입니다")
N7 = 4000
g7 = (rng.random(N7) < 0.5).astype(float)
print(" %s %s %s %s"
% (pw("번짐의 크기", 22), rw("추정값", 14), rw("참 효과", 12), rw("치우침", 12)))
for sp in [0.0, 0.3, 0.6, 1.0]:
yp = 5.0 + rng.normal(0, 1.0, N7)
yq = 5.0 + 1.5 + 2.0 * g7 + sp * (1 - g7) + rng.normal(0, 1.0, N7)
d = (float(yq[g7 == 1].mean() - yp[g7 == 1].mean())
- float(yq[g7 == 0].mean() - yp[g7 == 0].mean()))
print(" %s %14.6f %12.1f %12.6f" % (pw("%.1f" % sp, 22), d, 2.0, d - 2.0))
print(" 대조군이 덩달아 좋아지면 차이가 줄어 효과를 작게 봅니다")
print(" 번짐이 1.0 이면 효과가 절반으로 보입니다. 있는데 없어 보입니다")
print(" 177강 문제 5 의 간섭 없음 가정이 여기서 깨진 것입니다")
# --- 문제 5: 실무의 판정 ------------------------------------------------
print(" 대조군을 고르는 방법이 여럿입니다")
print(" %s %s %s"
% (pw("어떻게 고르는가", 24), rw("언제 쓰는가", 24), rw("무엇을 조심하는가", 26)))
for a, b, c in [("자연스러운 비교군", "제도가 일부에만 적용", "적용 이유가 결과와 무관한가"),
("성향 점수로 고름", "특성이 크게 다름", "193강의 겹침 문제"),
("합성 대조군", "처치 단위가 하나", "처치 전 적합의 과적합"),
("이웃한 지역", "경계가 뚜렷함", "번짐이 가장 심한 자리")]:
print(" %s %s %s" % (pw(a, 24), rw(b, 24), rw(c, 26)))
print(" 셋째 줄이 처치 단위가 하나일 때 쓰입니다. 여러 대조군을 섞어 만듭니다")
print(" 합성 대조군을 간단히 흉내 내 봅니다")
Tt = 20
K = 8
f1 = np.cumsum(rng.normal(0, 1, Tt))
f2 = np.cumsum(rng.normal(0, 1, Tt))
wtrue = rng.random(K)
wtrue = wtrue / wtrue.sum()
donors = np.stack([rng.normal(0, 1) * f1 + rng.normal(0, 1) * f2
+ rng.normal(0, 0.3, Tt) for _ in range(K)])
mix = np.array([0.5, 0.3, 0.2] + [0.0] * (K - 3))
treated = mix @ donors + rng.normal(0, 0.3, Tt)
treated[10:] += 3.0
pre = 10
A = donors[:, :pre].T
w, *_ = np.linalg.lstsq(A, treated[:pre], rcond=None)
syn = w @ donors
mean_d = donors.mean(axis=0)
print(" 처치 단위 하나와 대조 후보 %d 개이고 %d 시점부터 처치입니다"
% (K, pre))
print(" 처치 전 %d 시점으로 가중치를 맞춥니다. 참 효과는 3.0 입니다" % pre)
print(" %s %s %s" % (pw("무엇을 대조로", 24), rw("처치 전 오차", 16),
rw("처치 후 추정 효과", 20)))
for nm, cf in [("단순 평균", mean_d), ("합성 대조군", syn)]:
pe = float(np.sqrt(((treated[:pre] - cf[:pre]) ** 2).mean()))
ef = float((treated[pre:] - cf[pre:]).mean())
print(" %s %16.6f %20.6f" % (pw(nm, 24), pe, ef))
print(" 처치 전 오차가 1.0503 에서 0.1709 로 줄고 추정도 4.5531 에서 2.5132 로 옵니다")
print(" 그래도 참값 3.0 과 0.4868 차이가 납니다. 처치 전 10 시점으로 8 개를 맞췄기 때문입니다")
print(" 맞출 시점보다 후보가 많으면 과적합합니다. 189강 문제 3 과 같은 이야기입니다")
print(" 절차를 정리합니다")
print(" %s %s" % (pw("단계", 24), rw("무엇을 확인하는가", 30)))
for a, b in [("처치 시점 확정", "언제부터 누구에게 적용됐는가"),
("대조군 고르기", "왜 그 군이 비교 가능한가"),
("처치 전 추세 검사", "사건 연구 그림에서 평평한가"),
("표준오차", "군집 단위로 계산했는가"),
("구성 변화", "두 시점의 사람이 같은가"),
("번짐", "대조군이 영향을 받는가"),
("가짜 처치 검정", "일어나지 않은 시점에서 0 인가")]:
print(" %s %s" % (pw(a, 24), rw(b, 30)))
print(" 마지막 줄을 해 봅니다")
N8 = 4000
u8 = rng.normal(0, 1, N8)
g8 = (u8 > 0).astype(float)
print(" %s %s %s %s"
% (pw("어느 시점을 처치로 두는가", 30), rw("추정값", 14),
rw("있어야 하는 값", 18), rw("판정", 12)))
ys = [5.0 + 0.4 * k + 3.0 * u8 + (2.0 * g8 if k >= 3 else 0.0)
+ rng.normal(0, 1.0, N8) for k in range(6)]
for k, lab in [(1, "가짜"), (2, "가짜"), (3, "진짜"), (4, "처치 후")]:
d = (float(ys[k][g8 == 1].mean() - ys[k - 1][g8 == 1].mean())
- float(ys[k][g8 == 0].mean() - ys[k - 1][g8 == 0].mean()))
print(" %s %14.6f %18.1f %s"
% (pw("%d 시점" % k, 30), d, 2.0 if k == 3 else 0.0, rw(lab, 12)))
print(" 진짜 시점인 3 에서만 2.0 이 나오고 나머지 세 곳은 0 근처입니다")
print(" 마지막 줄은 이미 처치가 시작된 뒤라 새로 오르는 것이 없습니다")
print(" 가짜 시점에서 효과가 나오면 평행 추세를 의심해야 합니다")
print(" 194강의 결론은 뺄셈 두 번이 아니라 그 뺄셈이 기대는 가정입니다")
# 193강 문제 4 에서 못 잰 교란이 그대로 남았습니다
# 그 교란이 시간에 안 변한다면 뺄셈으로 지울 수 있습니다
# 처치군은 u 가 큰 쪽에 몰려 있고 u 는 관측되지 않습니다
# 시간이 지나면 두 군 모두 1.5 만큼 오릅니다. 참 효과는 2.0 입니다
# 무엇 처치군 대조군 차이
# 이전 7.146877 2.841789 4.305089
# 이후 10.670117 4.303370 6.366747
# 한 가지씩만 보면 어떻게 되는지 봅니다
# 어떻게 세는가 추정값 참값 치우침
# 처치군의 전후 차이 3.523240 2.0 1.523240
# 이후 시점의 군 차이 6.366747 2.0 4.366747
# 이전 시점의 군 차이 4.305089 2.0 2.305089
# 전후 차이는 시간 추세 1.5 를 효과로 잘못 셉니다
# 군 차이는 u 로 생긴 격차를 효과로 잘못 셉니다
# 마지막 줄이 열쇠입니다. 처치 전인데도 4.3051 만큼 벌어져 있습니다
# 두 뺄셈을 겹치면 둘 다 사라집니다
# 무엇 값 무엇을 지우는가
# 처치군의 전후 차이 3.523240 군 고유 수준
# 대조군의 전후 차이 1.461582 시간 추세
# 두 차이의 차이 2.061658 둘 다
# 이중차분 추정값 2.061658 이고 참값 2.0 입니다. 치우침 0.061658 입니다
# u 를 한 번도 안 썼는데 지워졌습니다. 시간에 안 변하기 때문입니다
# 이중차분은 상호작용항 하나짜리 회귀입니다
# y 를 군 표시와 시점 표시와 그 곱에 회귀합니다
# 항 추정값 표준오차 무엇을 뜻하는가
# 절편 2.841789 0.060463 대조군의 이전 수준
# 군 표시 4.305089 0.085083 군 고유 격차
# 시점 표시 1.461582 0.085507 시간 추세
# 군 곱하기 시점 2.061658 0.120325 이중차분 효과
# 곱 항의 계수 2.061658 이 앞의 네 평균으로 구한 값과 같습니다
# 회귀로 쓰면 공변량을 더 넣을 수 있고 표준오차가 따라 나옵니다
# 그런데 이 표준오차는 대개 틀립니다
# 같은 사람을 두 번 재면 두 관측이 이어져 있습니다
# 표준오차 계산 평균 실제 흔들림 포함률
# 보통 방식 0.448017 0.080690 1.0000
# 사람 단위 군집 0.081442 0.080690 0.9515
# 보통 방식이 실제 흔들림의 다섯 배를 넘게 잡아 포함률이 1.0 이 됩니다
# 같은 사람의 두 관측에 공통된 부분이 차분에서는 사라지는데
# 보통 방식은 그것을 잔차에 그대로 남겨 두기 때문입니다
# 군집 방식이 실제 흔들림에 붙고 포함률도 목표에 닿습니다
# 방향이 반대인 경우도 있습니다. 처치가 군집 수준이면 반대로 작아집니다
# 188강 문제 4 의 강건 표준오차가 여기서는 군집 단위로 확장됩니다
# 이중차분이 기대는 것은 평행 추세 하나입니다
# 처치가 없었다면 두 군이 같은 만큼 변했을 것이라는 가정입니다
# 자료 생성 추정값 참값 치우침
# 추세가 같음 2.019501 2.0 0.019501
# 처치군 추세가 0.5 빠름 2.452762 2.0 0.452762
# 처치군 추세가 1.0 빠름 3.006501 2.0 1.006501
# 처치군 추세가 0.5 느림 1.467367 2.0 -0.532633
# 추세가 어긋난 만큼 그대로 치우칩니다. 다른 오차원이 없습니다
# 가정이 깨지면 표본을 늘려도 안 낫습니다. 191강 문제 3 과 같습니다
# 처치 전 시점이 여럿이면 가정을 검사할 수 있습니다
# 처치 전 네 시점과 처치 후 세 시점을 봅니다
# 시점 추세가 같은 자료 추세가 어긋난 자료 처치 시점인가
# -4 0.057479 -0.942035 아니오
# -3 -0.014387 -0.626125 아니오
# -2 -0.009439 -0.243986 아니오
# -1 0.000000 0.000000 아니오
# 0 2.011457 2.313838 예
# 1 2.036984 2.585151 예
# 2 1.967867 2.947680 예
# 기준은 -1 시점이고 그 시점을 0 으로 두고 봅니다
# 왼쪽 자료는 처치 전 네 값이 0 근처이고 처치 후에 2.0 으로 뜁니다
# 오른쪽 자료는 처치 전부터 이미 기울어져 있습니다. 가정이 의심됩니다
# 두 자료의 처치 후 값은 비슷한데 처치 전이 다릅니다. 거기서 갈립니다
# 이것을 사건 연구 그림이라 합니다. 처치 전 계수가 핵심입니다
# 평행 추세 말고도 깨지는 자리가 있습니다
# 첫째는 평균 회귀입니다. 나쁜 시점을 골라 처치하면 저절로 좋아집니다
# 참 효과는 0 인데 이전 값이 낮은 30 퍼센트를 처치군으로 고릅니다
# 무엇 값
# 처치군의 전후 차이 1.510503
# 대조군의 전후 차이 -0.632142
# 이중차분 추정값 2.142645
# 참 효과 0.000000
# 2.142645 이 나옵니다. 결과값을 보고 고른 것이 원인입니다
# 191강 문제 4 의 선택편향이 시간축에서 나타난 모습입니다
# 처치 대상을 결과값으로 고르지 않았는지가 첫 질문입니다
# 둘째는 구성이 바뀌는 것입니다
# 누가 빠지는가 추정값 참값 치우침
# 아무도 안 빠짐 2.022128 2.0 0.022128
# 무작위로 20 퍼센트 2.003988 2.0 0.003988
# 처치군에서 u 낮은 사람이 3.349841 2.0 1.349841
# 대조군에서 u 높은 사람이 3.291807 2.0 1.291807
# 이후 시점에서만 빠지면 두 시점의 사람이 달라집니다
# 무작위로 빠지면 괜찮지만 u 를 따라 빠지면 크게 치우칩니다
# 같은 사람을 두 번 따라가면 이 문제가 사라집니다
# 셋째는 처치가 대조군에도 번지는 것입니다
# 번짐의 크기 추정값 참 효과 치우침
# 0.0 1.984134 2.0 -0.015866
# 0.3 1.684058 2.0 -0.315942
# 0.6 1.344878 2.0 -0.655122
# 1.0 0.932095 2.0 -1.067905
# 대조군이 덩달아 좋아지면 차이가 줄어 효과를 작게 봅니다
# 번짐이 1.0 이면 효과가 절반으로 보입니다. 있는데 없어 보입니다
# 177강 문제 5 의 간섭 없음 가정이 여기서 깨진 것입니다
# 대조군을 고르는 방법이 여럿입니다
# 어떻게 고르는가 언제 쓰는가 무엇을 조심하는가
# 자연스러운 비교군 제도가 일부에만 적용 적용 이유가 결과와 무관한가
# 성향 점수로 고름 특성이 크게 다름 193강의 겹침 문제
# 합성 대조군 처치 단위가 하나 처치 전 적합의 과적합
# 이웃한 지역 경계가 뚜렷함 번짐이 가장 심한 자리
# 셋째 줄이 처치 단위가 하나일 때 쓰입니다. 여러 대조군을 섞어 만듭니다
# 합성 대조군을 간단히 흉내 내 봅니다
# 처치 단위 하나와 대조 후보 8 개이고 10 시점부터 처치입니다
# 처치 전 10 시점으로 가중치를 맞춥니다. 참 효과는 3.0 입니다
# 무엇을 대조로 처치 전 오차 처치 후 추정 효과
# 단순 평균 1.050279 4.553092
# 합성 대조군 0.170855 2.513187
# 처치 전 오차가 1.0503 에서 0.1709 로 줄고 추정도 4.5531 에서 2.5132 로 옵니다
# 그래도 참값 3.0 과 0.4868 차이가 납니다. 처치 전 10 시점으로 8 개를 맞췄기 때문입니다
# 맞출 시점보다 후보가 많으면 과적합합니다. 189강 문제 3 과 같은 이야기입니다
# 절차를 정리합니다
# 단계 무엇을 확인하는가
# 처치 시점 확정 언제부터 누구에게 적용됐는가
# 대조군 고르기 왜 그 군이 비교 가능한가
# 처치 전 추세 검사 사건 연구 그림에서 평평한가
# 표준오차 군집 단위로 계산했는가
# 구성 변화 두 시점의 사람이 같은가
# 번짐 대조군이 영향을 받는가
# 가짜 처치 검정 일어나지 않은 시점에서 0 인가
# 마지막 줄을 해 봅니다
# 어느 시점을 처치로 두는가 추정값 있어야 하는 값 판정
# 1 시점 0.058126 0.0 가짜
# 2 시점 -0.047055 0.0 가짜
# 3 시점 1.980238 2.0 진짜
# 4 시점 0.053908 0.0 처치 후
# 진짜 시점인 3 에서만 2.0 이 나오고 나머지 세 곳은 0 근처입니다
# 마지막 줄은 이미 처치가 시작된 뒤라 새로 오르는 것이 없습니다
# 가짜 시점에서 효과가 나오면 평행 추세를 의심해야 합니다
# 194강의 결론은 뺄셈 두 번이 아니라 그 뺄셈이 기대는 가정입니다