191강에서 무작위 배정이 선택 치우침을 없앤다는 것을 봤습니다. 이제 실제로 어떻게 설계하는지 다룹니다.
191강 문제 5의 표에서 무작위가 막아 주는 것은 여섯 중 하나뿐이었습니다. 나머지 다섯은 설계와 운영이 막아야 하며, 이 강의가 그 자리입니다.
| 무엇을 정하는가 | 무엇이 걸려 있는가 |
|---|---|
| 배정 방식 | 균형과 검출력 |
| 표본 크기와 단위 | 검출할 수 있는 효과 |
| 눈가림 | 기대와 평가의 치우침 |
| 순응과 탈락 | 무엇을 추정하게 되는가 |
| 멈추는 규칙 | 오류율과 효과 크기 |
다섯 줄이 전부 자료를 보기 전에 정해집니다. 178강부터 되풀이된 원칙이 여기서 설계 문서가 됩니다.
문제. 배정 방식을 견줍니다.
(1) 네 가지 방식의 균형과 흔들림을 재세요.
(2) 배정 구조를 분석에 넣으세요.
생각의 실마리. 191강 문제 2에서 일 때 불균형이 컸습니다. 배정 방식으로 그것을 줄일 수 있습니다.
풀이. (1) 표본 명이고 예후 변수 가 결과에 강하게 영향을 줍니다.
| 배정 방식 | 처치군 수의 표준편차 | 불균형의 sd | 추정값의 sd | 기준 대비 |
|---|---|---|---|---|
| 동전 던지기 | ||||
| 순열 배정 | ||||
| 도착 순서로 블록 | ||||
| 순으로 블록 | ||||
| 짝지어 배정 |
동전 던지기는 인원수부터 흔들립니다. 표준편차가 명이라, 명 중 처치군이 명일 수도 명일 수도 있습니다.
도착 순서로 블록을 나누면 불균형이 순열과 거의 같습니다. 과 이며, 블록이 와 무관하므로 아무것도 안 해 줍니다.
순으로 블록을 나누거나 짝을 지으면 와 로 크게 줄어듭니다. 추정값의 흔들림도 배가 됩니다.
무엇으로 묶느냐가 정합니다. 예후 변수로 묶어야 이득이 있습니다.
(2) 짝지어 배정한 자료를 두 가지로 분석합니다.
| 분석 방법 | 추정값 평균 | 추정값의 sd | 표준오차 평균 | 실제 포함률 |
|---|---|---|---|---|
| 만 넣음 | ||||
| 와 를 넣음 |
둘 다 참값 에 닿습니다. 무작위였으므로 불편입니다.
그런데 만 넣으면 표준오차가 인데 참 흔들림은 입니다. 구간이 두 배 넘게 넓어 포함률이 이 됩니다.
배정에 쓴 구조를 분석에도 넣어야 합니다. 를 넣으면 표준오차가 로 참값에 붙고 포함률도 이 됩니다.
이 문제에서 배우는 것. 포함률이 인 것이 좋은 소식이 아닙니다. 구간이 필요 이상으로 넓다는 뜻이고, 그만큼 검출력을 버리고 있습니다. 183강 문제 5에서 유의하지 않은 결과가 "효과가 작다"인지 "못 쟀다"인지 갈렸는데, 여기서는 못 잰 쪽을 스스로 만든 셈입니다. 그리고 이것이 짝지은 자료를 독립처럼 분석하면 안 되는 이유이며, 178강 문제 3에서 짝짓기를 무시하면 검출력이 사라진 것과 정확히 같은 구조입니다.
바로 확인 1.
확인 1-1. 검산에서 동전 던지기의 처치군 수 표준편차를 쓰세요.
답. 명입니다.
확인 1-2. 도착 순서로 블록을 나눠도 불균형이 안 주는 이유를 쓰세요.
답. 블록이 와 무관해 쪽으로는 아무것도 안 해 주기 때문입니다.
확인 1-3. 검산에서 두 분석 방법의 표준오차와 포함률을 쓰세요.
답. 과 이며 포함률은 과 입니다.
문제. 설계 결정을 표본 크기로 옮깁니다.
(1) 무엇을 정해야 하는지 정리하세요.
(2) 결과 변수의 영향을 재세요.
(3) 배정 단위의 영향을 재세요.
생각의 실마리. 183강의 계산이 효과 크기와 표본 크기 둘만 다뤘습니다. 실험 설계에서는 그 둘을 정하는 결정들이 앞에 있습니다.
풀이. (1) 정할 것들입니다.
| 무엇을 정하는가 | 어디서 오는가 | 정하면 무엇이 따라오는가 |
|---|---|---|
| 의미 있는 최소 효과 | 비용과 도메인 | 표본 크기 |
| 결과 변수 | 무엇을 개선하려는가 | 분산과 검출력 |
| 배정 단위 | 간섭이 있는가 | 군집 설계효과 |
| 추적 기간 | 효과가 언제 나타나는가 | 탈락률 |
| 주 지표 하나 | 가장 중요한 물음 | 보정 필요 없음 |
183강 문제 5의 다섯 줄이 그대로입니다. 첫째 줄만 통계가 아닙니다.
(2) 같은 처치를 세 가지 결과로 잽니다.
| 결과 변수 | 처치군 평균 | 대조군 평균 | 표준화 효과 | 필요한 |
|---|---|---|---|---|
| 연속값 그대로 | ||||
| 를 넘는가 | ||||
| 을 넘는가 |
같은 처치인데 필요한 표본이 에서 까지 다섯 배 넘게 벌어집니다.
연속값을 문턱으로 잘라 이진으로 만들면 정보를 버립니다. 문턱이 극단으로 갈수록 더 많이 버리며, 181강 심화 4와 같은 이야기입니다.
그런데 이진 결과가 실무에서 뜻이 있을 때가 많습니다. "합격했는가"나 "구매했는가"가 실제로 중요한 것이면, 정보를 버리는 대가를 치르고라도 그것을 재야 합니다.
(3) 배정 단위를 뭉치로 두면 표본이 더 듭니다.
| 뭉치 크기 | 급내상관 | 설계효과 | 필요한 사람 수 |
|---|---|---|---|
뭉치 에 급내상관 면 명이 명이 됩니다. 여섯 배 가까이입니다.
173강 문제 3의 설계효과가 그대로 곱해집니다. 배정 단위는 간섭이 있는지가 정하며, 교실이나 매장 단위가 흔합니다.
이 문제에서 배우는 것. 간섭이 있으면 개인 배정이 아예 틀린 답을 줍니다. 백신을 개인에게 무작위 배정하면 대조군도 주변 사람들이 접종해 감염 위험이 낮아지므로, 효과가 과소평가됩니다. 191강 심화 1의 간섭 없음 가정이 깨지는 자리이며, 그때는 뭉치 배정이 비쌀 뿐 아니라 필요한 것이 됩니다. 추천 시스템의 A/B 테스트도 같은 문제를 갖는데, 처치군이 본 것이 대조군에게 노출되는 콘텐츠를 바꿉니다.
바로 확인 2.
확인 2-1. 검산에서 세 결과 변수의 필요한 을 쓰세요.
답. , , 입니다.
확인 2-2. 설계효과를 식으로 쓰세요.
답. 입니다.
확인 2-3. 검산에서 뭉치 에 급내상관 일 때 필요한 사람 수를 쓰세요.
답. 명이며 개인 배정의 명에 견줍니다.
문제. 눈가림을 다룹니다.
(1) 누구를 가리는지 정리하세요.
(2) 눈가림이 깨질 때의 치우침을 재세요.
(3) 위약 반응을 재려면 무엇이 필요한지 보세요.
생각의 실마리. 무작위 배정이 누가 받을지를 정했습니다. 누가 무엇을 받았는지 아는 것은 아직 안 막았습니다.
풀이. (1) 층이 넷입니다.
| 누구를 가리는가 | 무엇을 막는가 | 이름 |
|---|---|---|
| 참가자 | 기대에 따른 반응 | 단일 눈가림 |
| 참가자와 시행자 | 다르게 대하는 것 | 이중 눈가림 |
| 평가자까지 | 평가의 치우침 | 삼중 눈가림 |
| 분석자까지 | 분석 선택의 치우침 | 네 겹 눈가림 |
마지막 줄이 요즘 강조됩니다. 189강 문제 3의 선택 문제 때문이며, 어느 군이 어느 군인지 모른 채 분석하면 분석자가 결과를 보고 방법을 고를 수 없습니다.
(2) 눈가림이 깨질 때의 치우침을 잽니다. 참 효과는 이고 자기가 처치군인 줄 알면 만큼 더 좋게 답합니다.
| 눈가림 상태 | 추정값 평균 | 참값 | 치우침 |
|---|---|---|---|
| 완전히 가림 | |||
| 퍼센트가 알아챔 | |||
| 절반이 알아챔 | |||
| 다 알아챔 |
알아채는 비율에 비례해 치우침이 커집니다. , , 이 각각 의 , , 퍼센트에 가깝습니다.
위약을 쓰면 대조군도 무언가를 받으므로 알아채기 어려워집니다.
(3) 위약 반응 자체를 재려면 세 팔이 필요합니다.
| 무엇과 무엇을 견주는가 | 차이 | 무엇을 재는가 |
|---|---|---|
| 위약 대 아무것도 안 함 | 위약 반응 | |
| 처치 대 위약 | 약 자체의 효과 | |
| 처치 대 아무것도 안 함 | 둘을 합친 것 |
두 팔만 있으면 둘째 줄만 잽니다. 그것이 대개 알고 싶은 값입니다.
위약 반응 자체가 관심이면 세 팔이 필요합니다. 그리고 실무에서는 셋째 줄이 정책적으로 더 중요한 경우도 있는데, 실제 환자가 받는 것이 약과 기대를 합친 것이기 때문입니다.
이 문제에서 배우는 것. 눈가림이 불가능한 처치가 많습니다. 수술, 운동, 교육, 사용자 인터페이스 변경은 받는 사람이 알 수밖에 없습니다. 그럴 때 할 수 있는 일이 평가자와 분석자만이라도 가리는 것이고, 객관적 지표를 쓰는 것입니다. 자기 보고 만족도는 눈가림 없이 재면 위 표의 넷째 줄이 되므로, 행동 지표나 기계가 재는 값을 주 지표로 두는 편이 낫습니다.
바로 확인 3.
확인 3-1. 네 겹 눈가림에서 분석자를 가리는 이유를 쓰세요.
답. 결과를 보고 분석 방법을 고르는 것을 막기 위해서입니다.
확인 3-2. 검산에서 절반이 알아챌 때의 치우침을 쓰세요.
답. 이며 참값 의 퍼센트에 가깝습니다.
확인 3-3. 검산에서 세 팔 설계의 세 차이를 쓰세요.
답. , , 입니다.
문제. 순응 문제를 다룹니다.
(1) 세 가지 세는 법을 견주세요.
(2) 사람의 종류를 나누세요.
(3) 순응률이 표본 크기에 미치는 영향을 재세요.
생각의 실마리. 배정은 무작위인데 실제 복용은 사람이 정합니다. 그러면 실제 복용으로 나눈 두 집단은 더 이상 무작위가 아닙니다.
풀이. (1) 참 효과는 입니다. 가 큰 사람은 배정과 무관하게 받고 작은 사람은 배정과 무관하게 안 받습니다.
| 사람의 종류 | 비율 | 의 평균 |
|---|---|---|
| 언제나 받는 사람 | ||
| 따르는 사람 | ||
| 절대 안 받는 사람 |
| 무엇으로 세는가 | 추정값 | 무엇을 추정 |
|---|---|---|
| 배정된 대로 | 배정의 효과 | |
| 실제 받은 대로 | 아무것도 아님 | |
| 배정의 효과를 순응률로 나눔 | 따르는 사람의 효과 |
실제 받은 대로 세면 입니다. 참값 보다 퍼센트 큽니다.
언제나 받는 사람의 평균이 이라 처치군에 몰립니다. 191강 문제 1의 선택 치우침이 그대로 돌아왔습니다.
배정의 효과는 로 희석되어 있습니다. 배정이 실제 복용을 만큼만 바꾸기 때문입니다.
순응률 차이가 이고 실제 따르는 사람의 비율이 입니다. 둘이 같은 것이 우연이 아니며, 배정이 바꾼 사람이 곧 따르는 사람이기 때문입니다.
(2) 사람을 넷으로 나눕니다.
| 사람의 종류 | 무엇을 하는가 |
|---|---|
| 따르는 사람 | 배정된 대로 합니다 |
| 언제나 받는 사람 | 배정과 무관하게 받습니다 |
| 절대 안 받는 사람 | 배정과 무관하게 안 받습니다 |
| 청개구리 | 배정과 반대로 합니다 |
청개구리가 없다고 가정해야 나눗셈이 뜻을 갖습니다. 195강에서 다룹니다.
가운데 둘은 배정이 실제 처치를 안 바꾸므로 효과에 기여하지 않습니다. 그래서 나눗셈으로 나오는 값이 따르는 사람에게서의 효과입니다.
(3) 순응률이 표본 크기에 미치는 영향을 봅니다.
| 순응률 | 배정의 효과 | 필요한 | 완전 순응 대비 |
|---|---|---|---|
순응률이 절반이면 표본이 정확히 네 배 듭니다. 효과가 절반으로 희석되고 183강 문제 2의 제곱 반비례가 작동하기 때문입니다.
순응률 면 배입니다. 그래서 실험 설계에서 순응을 높이는 데 드는 비용이 표본을 늘리는 비용보다 대개 쌉니다.
이 문제에서 배우는 것. "실제 복용한 사람만 분석하자"는 제안이 가장 흔하고 가장 위험한 요청입니다. 겉보기에는 더 정확해 보이고 효과도 크게 나오는데, 위 표에서 이 그 값입니다. 무작위 배정으로 얻은 것을 분석 단계에서 버리는 셈이며, 191강 문제 1의 분해로 돌아가면 선택 치우침이 되살아난 것입니다. 그래서 임상시험의 표준이 처리 의도 분석이고, 순응까지 반영하고 싶으면 나눗셈이나 195강의 도구변수를 씁니다.
바로 확인 4.
확인 4-1. 검산에서 세 가지 세는 법의 추정값을 쓰세요.
답. , , 입니다.
확인 4-2. 실제 받은 대로 세면 왜 치우치는지 검산 값과 함께 쓰세요.
답. 언제나 받는 사람의 평균이 이라 처치군에 몰리기 때문입니다.
확인 4-3. 검산에서 순응률이 절반일 때 필요한 표본 배수를 쓰세요.
답. 배입니다.
문제. 중간 분석을 설계합니다.
(1) 세 가지 멈추는 규칙의 오류율을 재세요.
(2) 두 방식의 성격을 견주세요.
(3) 조기 종료의 대가를 재세요.
생각의 실마리. 178강 심화 4에서 여러 번 보면 오류율이 오른다고 했습니다. 미리 계획하면 여러 번 볼 수 있습니다.
풀이. (1) 효과가 인 자료를 다섯 시점에서 보고 유의하면 멈춥니다.
| 멈추는 규칙 | 실제 오류율 | 목표 | 판정 |
|---|---|---|---|
| 매번 | 나쁨 | ||
| 포콕 | 좋음 | ||
| 오브라이언-플레밍 | 좋음 |
매번 을 쓰면 가 됩니다. 다섯 번 봤기 때문입니다.
포콕과 오브라이언-플레밍은 둘 다 목표를 지킵니다. 포콕은 매번 같은 기준 을 쓰고, 오브라이언-플레밍의 기준은 , , , , 입니다.
정보가 쌓인 비율의 제곱근으로 나눕니다. 초반에는 정보가 적어 기준이 아주 높습니다.
(2) 두 방식의 성격을 견줍니다.
| 멈추는 규칙 | 첫 시점 기준 | 마지막 기준 | 무엇이 좋은가 |
|---|---|---|---|
| 포콕 | 조기 종료가 쉬움 | ||
| 오브라이언-플레밍 | 끝까지 가면 손해 적음 |
마지막 기준이 이라 최종 분석에서 보다 조금만 엄격합니다.
포콕은 끝까지 가면 을 써야 해 손해가 큽니다. 대신 초반에 진짜 효과가 크면 일찍 멈출 수 있습니다.
임상시험이 오브라이언-플레밍을 표준으로 쓰는 이유가 여기 있습니다. 대부분의 시험은 끝까지 가므로, 최종 분석의 손해를 최소화하는 쪽이 유리합니다.
(3) 조기 종료의 대가를 잽니다. 참 효과가 인 자료입니다.
| 어디서 멈췄는가 | 몇 번 그랬는가 | 그때 추정한 효과 | 참값 |
|---|---|---|---|
| 번째 시점 | |||
| 번째 시점 | |||
| 번째 시점 | |||
| 번째 시점 | |||
| 번째 시점 | |||
| 끝까지 감 |
전체 평균은 이고 참값은 입니다. 전체로 보면 거의 맞습니다.
그런데 일찍 멈춘 실험만 보면 크게 부풀어 있습니다. 번째에서 멈춘 것들은 평균 로 참값의 배입니다.
끝까지 간 것들은 로 작습니다. 발표되는 것이 대개 멈춘 쪽이므로, 문헌에 실리는 값이 부풀어 있습니다.
183강 문제 3의 승자의 저주이며 여기서는 시간축을 따라 일어납니다. 그래서 조기 종료한 시험의 효과 크기는 보정해서 보고해야 합니다.
마지막으로 실험 설계에서 미리 정할 것을 정리합니다.
| 무엇 | 왜 미리 정해야 하는가 |
|---|---|
| 주 지표 | 182강 문제 5의 보정을 피합니다 |
| 표본 크기 | 183강의 검출력을 확보합니다 |
| 배정 방식 | 분석에도 같은 구조를 씁니다 |
| 멈추는 규칙 | 알파를 미리 나눠 씁니다 |
| 탈락 처리 | 191강 문제 4의 선택편향을 막습니다 |
| 분석 계획 | 189강 문제 3의 선택을 막습니다 |
전부 자료를 보기 전에 정해 등록합니다. 178강부터 되풀이된 원칙입니다.
무작위 배정은 강력하지만 그것만으로 충분한 적이 한 번도 없습니다.
이 문제에서 배우는 것. 조기 종료가 윤리적 의무와 통계적 정직 사이의 맞바꿈입니다. 처치가 명백히 좋으면 대조군을 더 두는 것이 비윤리적이므로 멈춰야 하는데, 그러면 효과 추정이 부풀어 다음 연구자가 그 값으로 설계하게 됩니다. 183강 문제 3의 고리가 그대로 반복되며, 그래서 조기 종료 시험은 효과 크기 대신 구간을 강조하고 보정된 추정을 함께 싣습니다. 그리고 무익성 경계를 함께 두어, 효과가 없을 것이 분명해도 멈추게 하는 것이 요즘의 표준입니다.
바로 확인 5.
확인 5-1. 검산에서 세 멈추는 규칙의 오류율을 쓰세요.
답. , , 입니다.
확인 5-2. 오브라이언-플레밍 경계를 식으로 쓰고 마지막 값을 쓰세요.
답. 정보 비율의 제곱근으로 나눈 것이며 마지막이 입니다.
확인 5-3. 검산에서 번째 시점에 멈춘 것들의 평균 효과를 쓰세요.
답. 로 참값 의 배입니다.
| 배정 방식 | 무엇을 맞추는가 |
|---|---|
| 동전 던지기 | 아무것도 |
| 순열 배정 | 인원수 |
| 도착 순서 블록 | 인원수와 시간 추세 |
| 예후 변수 블록 | 인원수와 그 변수 |
| 짝지어 배정 | 가장 강하게 |
| 무엇으로 세는가 | 무엇을 추정 |
|---|---|
| 배정된 대로 | 배정의 효과 |
| 실제 받은 대로 | 아무것도 아님 |
| 배정을 순응률로 나눔 | 따르는 사람의 효과 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 동전 던지기로 배정합니다 | 인원수부터 흔들립니다 |
| 배정 구조를 분석에서 무시합니다 | 구간이 지나치게 넓어집니다 |
| 연속 결과를 문턱으로 자릅니다 | 표본이 다섯 배 듭니다 |
| 뭉치 배정인데 개인으로 셉니다 | 설계효과를 빠뜨립니다 |
| 실제 복용한 사람만 분석합니다 | 무작위성을 버립니다 |
| 중간에 그냥 들여다봅니다 | 오류율이 세 배가 됩니다 |
문제 6. 검산에서 동전 던지기의 처치군 수 표준편차를 쓰세요.
답. 명입니다.
문제 7. 도착 순서로 블록을 나눠도 불균형이 안 주는 이유를 쓰세요.
답. 블록이 와 무관해 쪽으로는 아무것도 안 해 주기 때문입니다.
문제 8. 검산에서 짝지어 배정의 불균형과 기준 대비를 쓰세요.
답. 이고 추정값 흔들림이 배입니다.
문제 9. 검산에서 두 분석 방법의 표준오차와 포함률을 쓰세요.
답. 과 이며 포함률은 과 입니다.
문제 10. 검산에서 세 결과 변수의 필요한 을 쓰세요.
답. , , 입니다.
문제 11. 검산에서 뭉치 에 급내상관 일 때 필요한 사람 수를 쓰세요.
답. 명입니다.
문제 12. 검산에서 절반이 알아챌 때의 치우침을 쓰세요.
답. 입니다.
문제 13. 검산에서 세 팔 설계의 세 차이를 쓰세요.
답. , , 입니다.
문제 14. 검산에서 세 가지 세는 법의 추정값을 쓰세요.
답. , , 입니다.
문제 15. 실제 받은 대로 세면 왜 치우치는지 검산 값과 함께 쓰세요.
답. 언제나 받는 사람의 평균이 이라 처치군에 몰리기 때문입니다.
문제 16. 검산에서 순응률이 절반일 때 필요한 표본 배수를 쓰세요.
답. 배입니다.
문제 17. 검산에서 세 멈추는 규칙의 오류율을 쓰세요.
답. , , 입니다.
문제 18. 검산에서 번째 시점에 멈춘 것들의 평균 효과를 쓰세요.
답. 로 참값 의 배입니다.
심화 1. 최소화 배정을 정리하세요.
문제 1의 짝지어 배정은 변수 하나에만 씁니다. 변수가 여럿이면 다른 방법이 필요합니다.
| 단계 | 무엇을 하는가 |
|---|---|
| 지금까지의 불균형 점수를 계산합니다 | |
| 다음 사람을 각 군에 넣어 봅니다 | |
| 불균형이 작아지는 쪽으로 배정합니다 | |
| 확률 쯤으로 그쪽을 고릅니다 |
넷째 줄이 중요합니다. 완전히 결정적으로 하면 다음 배정을 예측할 수 있어 눈가림이 깨집니다.
균형은 가장 잘 맞습니다. 변수 열 개를 동시에 맞출 수 있으며, 층화 배정은 층이 개가 되어 못 합니다.
대신 분석이 까다롭습니다. 배정이 무작위가 아니므로 순열 검정을 그 절차에 맞게 해야 하며, 실무에서는 배정에 쓴 변수를 회귀에 넣습니다.
심화 2. 다양한 실험 설계를 정리하세요.
| 설계 | 무엇이 다른가 |
|---|---|
| 평행군 | 각 사람이 한 처치만 |
| 교차 | 각 사람이 순서대로 둘 다 |
| 요인 | 여러 처치를 동시에 배정 |
| 계단식 | 뭉치마다 시작 시점을 달리 |
둘째 줄이 178강 문제 3의 짝짓기입니다. 같은 사람 안에서 견주므로 검출력이 크게 오릅니다.
대신 이월 효과가 있으면 못 씁니다. 앞 처치의 영향이 남으면 씻어 내는 기간이 필요합니다.
셋째 줄이 효율적입니다. 처치 둘을 각각 시험하는 대신 로 배정하면, 같은 표본으로 두 물음에 답합니다. 186강 문제 3의 교호작용까지 봅니다.
넷째 줄이 정책 평가에서 쓰입니다. 모두에게 결국 처치를 주되 순서를 무작위로 정하므로, 윤리 문제를 줄이면서 비교가 가능합니다.
심화 3. 무익성 경계를 정리하세요.
문제 5에서 효과가 클 때 멈추는 것을 봤습니다. 없을 때도 멈춰야 합니다.
| 왜 멈추는가 | 무엇을 아낍니다 |
|---|---|
| 효과가 명백함 | 대조군의 손해 |
| 효과가 없을 것이 명백함 | 참가자와 비용 |
둘째 줄이 무익성 경계입니다. 조건부 검정력을 계산해, 끝까지 가도 유의할 가능성이 낮으면 멈춥니다.
그 값이 아래면 멈추는 것이 관례입니다. 다만 무익성으로 멈추는 것은 효과가 없다는 증거가 아니라 못 잡겠다는 판단입니다.
무익성 경계는 오류율을 오히려 낮춥니다. 멈추면 기각할 기회가 사라지므로, 알파를 나눌 필요가 없습니다.
심화 4. 등록과 보고 지침을 정리하세요.
| 무엇 | 어디에 |
|---|---|
| 시험 등록 | 시작 전 공개 등록부 |
| 프로토콜 | 설계와 분석 계획 |
| 통계 분석 계획 | 눈가림 해제 전 확정 |
| 보고 지침 | CONSORT 흐름도 |
넷째 줄이 191강 문제 4를 겨냥합니다. 몇 명이 등록하고 몇 명이 배정되고 몇 명이 탈락했는지 숫자로 추적하게 만듭니다.
등록이 출판 편향을 줄입니다. 결과가 안 나온 시험도 등록부에 남으므로, 메타분석에서 빠진 것을 셀 수 있습니다.
셋째 줄이 189강 문제 5의 자료 분할과 같은 역할입니다. 눈가림이 풀리기 전에 분석을 확정하면, 결과를 보고 방법을 고를 수 없습니다.
심화 5. 실험의 일반화를 정리하세요.
191강 문제 5에서 무작위가 일반화 가능성을 안 막는다고 했습니다.
| 무엇 | 무엇을 보장하는가 |
|---|---|
| 내적 타당도 | 이 표본에서의 인과 |
| 외적 타당도 | 다른 사람들에게도 |
무작위 배정은 첫째 줄만 줍니다. 둘째 줄은 표본이 어떻게 뽑혔는지가 정하며, 173강의 표집 문제입니다.
임상시험 참가자는 대개 특별합니다. 자원했고, 기준을 통과했고, 병원에 접근할 수 있습니다. 그 사람들에게서의 효과가 일반 인구에서도 같을 이유는 없습니다.
186강 문제 4의 이질적 효과가 여기서 문제가 됩니다. 효과가 사람마다 다르면 누구에게서 쟀느냐가 답을 바꿉니다.
그래서 요즘은 실용적 시험이 늘고 있습니다. 기준을 느슨하게 하고 실제 진료 환경에서 하며, 내적 타당도를 조금 내주고 외적 타당도를 삽니다.
심화 6. 이 강의가 어디에 쓰이는지 정리하세요.
| 분야 | 쓰임 | 이어지는 강의 |
|---|---|---|
| 관측 자료 | 실험을 흉내 내기 | 193강 |
| 시간 축 | 전후 비교 | 194강 |
| 순응 문제 | 도구변수 일반화 | 195강 |
| 온라인 실험 | A/B 테스트 | S19 |
첫째 줄이 193강의 목표입니다. 무작위 배정을 못 할 때, 잰 변수로 비슷한 사람을 짝지어 실험을 흉내 냅니다.
설계를 먼저 적는 것이 핵심입니다. 어떤 실험을 하고 싶었는지 명시하면, 관측 자료에서 무엇이 부족한지가 드러납니다.
셋째 줄이 문제 4의 나눗셈을 일반화합니다. 배정이 아닌 다른 무작위한 것도 지렛대로 쓸 수 있으며, 195강의 도구변수입니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| RCT | 무작위 대조시험 | 처치를 무작위로 배정하는 실험입니다 |
| 순열 배정 | permuted assignment | 인원수를 정확히 나눕니다 |
| 블록 배정 | block randomization | 묶음마다 균형을 맞춥니다 |
| 최소화 | minimization | 불균형이 작아지는 쪽으로 배정합니다 |
| 눈가림 | blinding | 누가 무엇을 받았는지 가립니다 |
| 위약 | placebo | 효과 없는 것을 대조군에 줍니다 |
| 처리 의도 분석 | intention to treat | 배정된 대로 셉니다 |
| 실제 복용 분석 | per-protocol | 실제 받은 대로 셉니다 |
| 순응률 | compliance rate | 배정이 실제 처치를 바꾼 비율입니다 |
| 포콕 경계 | Pocock boundary | 매번 같은 기준을 씁니다 |
| 오브라이언-플레밍 | O'Brien-Fleming | 초반에 엄격하고 후반에 느슨합니다 |
| 무익성 경계 | futility boundary | 효과가 없을 것이 분명하면 멈춥니다 |
| 계단식 설계 | stepped wedge | 뭉치마다 시작 시점을 달리합니다 |
다음은 193강 성향점수 매칭입니다. 이 강의가 무작위 배정을 할 수 있을 때를 다뤘습니다.
191강 심화 5에서 무작위가 불가능한 자리를 봤습니다. 그럴 때 잰 변수로 비슷한 사람을 짝지어 실험처럼 만드는 것이 193강이며, 177강 문제 4의 성향 점수와 190강의 로지스틱 회귀가 그 도구입니다. 그리고 그 방법이 잰 변수 밖으로는 여전히 못 나간다는 것도 함께 봅니다.
import numpy as np
rng = np.random.default_rng(20260929)
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 sig(z):
return 1.0 / (1.0 + np.exp(-np.clip(z, -500, 500)))
def ols(y, *xs):
A = np.stack([np.ones(len(y))] + list(xs), axis=1)
b, *_ = np.linalg.lstsq(A, y, rcond=None)
e = y - A @ b
n, p = A.shape
s2 = (e ** 2).sum() / (n - p)
se = np.sqrt(s2 * np.diag(np.linalg.pinv(A.T @ A)))
return b, se
# --- 문제 1: 배정 방식을 고릅니다 ---------------------------------------
print(" 191강 문제 2 에서 작은 실험의 불균형을 봤습니다. 배정 방식으로 줄입니다")
N1, R1 = 40, 20000
x1 = rng.normal(0, 1, N1)
print(" 표본 40 명이고 예후 변수 x 가 결과에 강하게 영향을 줍니다")
print(" %s %s %s %s %s"
% (pw("배정 방식", 22), rw("처치군 수의 표준편차", 22), rw("x 불균형의 sd", 18),
rw("추정값의 sd", 16), rw("기준 대비", 12)))
def assign(kind, n, xv):
if kind == "coin":
return (rng.random(n) < 0.5).astype(float)
if kind == "perm":
t = np.zeros(n)
t[rng.permutation(n)[: n // 2]] = 1.0
return t
if kind in ("block", "blockx"):
t = np.zeros(n)
order = np.arange(n) if kind == "block" else np.argsort(xv)
for s in range(0, n, 4):
idx = order[s:s + 4]
pick = rng.permutation(len(idx))[: len(idx) // 2]
t[idx[pick]] = 1.0
return t
o = np.argsort(xv)
t = np.zeros(n)
for s in range(0, n, 2):
pair = o[s:s + 2]
if len(pair) == 2:
t[pair[rng.integers(0, 2)]] = 1.0
return t
base_sd = None
for nm, kind in [("동전 던지기", "coin"), ("순열 배정", "perm"),
("도착 순서로 블록", "block"), ("x 순으로 블록", "blockx"),
("짝지어 배정", "pair")]:
cnt, imb, est = [], [], []
for _ in range(R1):
t = assign(kind, N1, x1)
if t.sum() < 2 or t.sum() > N1 - 2:
continue
y = 10.0 + 2.0 * t + 3.0 * x1 + rng.normal(0, 1.0, N1)
cnt.append(float(t.sum()))
imb.append(float(x1[t == 1].mean() - x1[t == 0].mean()))
est.append(float(y[t == 1].mean() - y[t == 0].mean()))
sd = float(np.std(est, ddof=1))
if base_sd is None:
base_sd = sd
print(" %s %22.4f %18.4f %16.4f %12.4f"
% (pw(nm, 22), float(np.std(cnt, ddof=1)), float(np.std(imb, ddof=1)),
sd, sd / base_sd))
print(" 동전 던지기는 인원수부터 흔들립니다. 표준편차가 3.17 명입니다")
print(" 순열 배정은 인원수를 정확히 반으로 맞춥니다")
print(" 도착 순서로 블록을 나누면 x 불균형은 순열과 거의 같습니다")
print(" 블록이 x 와 무관하므로 x 쪽으로는 아무것도 안 해 줍니다")
print(" x 순으로 블록을 나누거나 짝을 지으면 x 불균형이 크게 줄어듭니다")
print(" 무엇으로 묶느냐가 정합니다. 예후 변수로 묶어야 이득이 있습니다")
print(" 배정에 쓴 구조를 분석에도 넣어야 합니다")
print(" 짝지어 배정한 자료를 두 가지로 분석해 봅니다")
R2 = 6000
naive, adj = [], []
for _ in range(R2):
t = assign("pair", N1, x1)
y = 10.0 + 2.0 * t + 3.0 * x1 + rng.normal(0, 1.0, N1)
b1, s1 = ols(y, t)
b2, s2 = ols(y, t, x1)
naive.append((b1[1], s1[1]))
adj.append((b2[1], s2[1]))
naive = np.array(naive)
adj = np.array(adj)
print(" %s %s %s %s %s"
% (pw("분석 방법", 22), rw("추정값 평균", 14), rw("추정값의 sd", 16),
rw("표준오차 평균", 16), rw("실제 포함률", 14)))
for nm, arr in [("t 만 넣음", naive), ("t 와 x 를 넣음", adj)]:
cov = float((np.abs(arr[:, 0] - 2.0) < 1.9600 * arr[:, 1]).mean())
print(" %s %14.4f %16.4f %16.4f %14.4f"
% (pw(nm, 22), float(arr[:, 0].mean()), float(arr[:, 0].std(ddof=1)),
float(arr[:, 1].mean()), cov))
print(" 둘 다 참값 2.0 에 닿습니다. 무작위였으므로 불편입니다")
print(" x 를 넣으면 표준오차가 크게 줄고 포함률도 목표에 붙습니다")
print(" t 만 넣으면 표준오차가 참 흔들림보다 커서 구간이 지나치게 넓습니다")
# --- 문제 2: 무엇을 얼마나 모을 것인가 ----------------------------------
print(" 183강의 표본 크기 계산이 실험 설계 전체로 넓어집니다")
print(" %s %s %s" % (pw("무엇을 정하는가", 24), rw("어디서 오는가", 26),
rw("정하면 무엇이 따라오는가", 26)))
for a, b, c in [("의미 있는 최소 효과", "비용과 도메인", "표본 크기"),
("결과 변수", "무엇을 개선하려는가", "분산과 검출력"),
("배정 단위", "간섭이 있는가", "군집 설계효과"),
("추적 기간", "효과가 언제 나타나는가", "탈락률"),
("주 지표 하나", "가장 중요한 물음", "보정 필요 없음")]:
print(" %s %s %s" % (pw(a, 24), rw(b, 26), rw(c, 26)))
print(" 183강 문제 5 의 다섯 줄이 그대로입니다. 첫째 줄만 통계가 아닙니다")
print(" 결과 변수를 무엇으로 두느냐가 표본을 크게 바꿉니다")
print(" 같은 처치를 세 가지 결과로 잽니다. 참 효과는 모두 같은 자리에서 옵니다")
N3 = 300000
t3 = (rng.random(N3) < 0.5).astype(float)
lat = 0.4 * t3 + rng.normal(0, 1.0, N3)
print(" %s %s %s %s %s"
% (pw("결과 변수", 20), rw("처치군 평균", 14), rw("대조군 평균", 14),
rw("표준화 효과", 14), rw("필요한 n", 12)))
za, zb = 1.959964, 0.841621
for nm, yv in [("연속값 그대로", lat),
("0.5 를 넘는가", (lat > 0.5).astype(float)),
("2.0 을 넘는가", (lat > 2.0).astype(float))]:
m1 = float(yv[t3 == 1].mean())
m0 = float(yv[t3 == 0].mean())
sp = np.sqrt((yv[t3 == 1].var(ddof=1) + yv[t3 == 0].var(ddof=1)) / 2.0)
d = (m1 - m0) / sp
nn = 2.0 * (za + zb) ** 2 / d ** 2
print(" %s %14.6f %14.6f %14.6f %12.0f"
% (pw(nm, 20), m1, m0, d, np.ceil(nn)))
print(" 같은 처치인데 결과를 어떻게 재느냐로 필요한 표본이 크게 달라집니다")
print(" 연속값을 문턱으로 잘라 이진으로 만들면 정보를 버립니다")
print(" 문턱이 극단으로 갈수록 더 많이 버립니다. 181강 심화 4 와 같은 이야기입니다")
print(" 배정 단위를 개인이 아니라 뭉치로 두면 표본이 더 듭니다")
print(" %s %s %s %s" % (pw("뭉치 크기", 12), rw("급내상관", 12),
rw("설계효과", 12), rw("필요한 사람 수", 18)))
n_ind = 2.0 * (za + zb) ** 2 / 0.3 ** 2
for m, rho in [(1, 0.0), (10, 0.02), (30, 0.02), (30, 0.05), (100, 0.05)]:
deff = 1.0 + (m - 1) * rho
print(" %s %12.2f %12.4f %18.0f"
% (pw("%d" % m, 12), rho, deff, np.ceil(n_ind * deff)))
print(" 173강 문제 3 의 설계효과가 그대로 곱해집니다")
print(" 뭉치 100 에 급내상관 0.05 면 다섯 배가 넘게 듭니다")
print(" 배정 단위는 간섭이 있는지가 정합니다. 교실이나 매장 단위가 흔합니다")
# --- 문제 3: 눈가림과 위약 ---------------------------------------------
print(" 누가 무엇을 받았는지 알면 결과가 달라집니다")
print(" %s %s %s" % (pw("누구를 가리는가", 20), rw("무엇을 막는가", 26),
rw("이름", 16)))
for a, b, c in [("참가자", "기대에 따른 반응", "단일 눈가림"),
("참가자와 시행자", "다르게 대하는 것", "이중 눈가림"),
("평가자까지", "평가의 치우침", "삼중 눈가림"),
("분석자까지", "분석 선택의 치우침", "네 겹 눈가림")]:
print(" %s %s %s" % (pw(a, 20), rw(b, 26), rw(c, 16)))
print(" 마지막 줄이 요즘 강조됩니다. 189강 문제 3 의 선택 문제 때문입니다")
print(" 눈가림이 깨지면 얼마나 나빠지는지 봅니다")
N4, R4 = 400, 3000
print(" 참 효과는 1.0 이고 자기가 처치군인 줄 알면 0.6 만큼 더 좋게 답합니다")
print(" %s %s %s %s" % (pw("눈가림 상태", 24), rw("추정값 평균", 16),
rw("참값", 10), rw("치우침", 12)))
for nm, pknow in [("완전히 가림", 0.0), ("10 퍼센트가 알아챔", 0.1),
("절반이 알아챔", 0.5), ("다 알아챔", 1.0)]:
acc = []
for _ in range(R4 // 3):
t = (rng.random(N4) < 0.5).astype(float)
know = (rng.random(N4) < pknow).astype(float)
y = 1.0 * t + 0.6 * t * know + rng.normal(0, 1.0, N4)
acc.append(float(y[t == 1].mean() - y[t == 0].mean()))
v = float(np.mean(acc))
print(" %s %16.4f %10.1f %12.4f" % (pw(nm, 24), v, 1.0, v - 1.0))
print(" 알아채는 비율에 비례해 치우침이 커집니다")
print(" 위약을 쓰면 대조군도 무언가를 받으므로 알아채기 어려워집니다")
print(" 위약 반응 자체를 재려면 세 팔이 필요합니다")
N5 = 300000
arm = rng.integers(0, 3, N5)
y5 = np.where(arm == 0, 0.0, np.where(arm == 1, 0.5, 1.5)) + rng.normal(0, 1.0, N5)
print(" 아무것도 안 함 대 위약 대 진짜 처치를 나눕니다")
print(" %s %s %s" % (pw("무엇과 무엇을 견주는가", 26), rw("차이", 14),
rw("무엇을 재는가", 22)))
m_no = float(y5[arm == 0].mean())
m_pl = float(y5[arm == 1].mean())
m_tr = float(y5[arm == 2].mean())
for nm, v, msg in [("위약 대 아무것도 안 함", m_pl - m_no, "위약 반응"),
("처치 대 위약", m_tr - m_pl, "약 자체의 효과"),
("처치 대 아무것도 안 함", m_tr - m_no, "둘을 합친 것")]:
print(" %s %14.6f %s" % (pw(nm, 26), v, rw(msg, 22)))
print(" 두 팔만 있으면 둘째 줄만 잽니다. 그것이 대개 알고 싶은 값입니다")
print(" 위약 반응 자체가 관심이면 세 팔이 필요합니다")
# --- 문제 4: 안 지키는 사람들 -------------------------------------------
print(" 배정한 대로 안 따르는 사람이 있습니다")
N6 = 400000
z6 = (rng.random(N6) < 0.5).astype(float)
u6 = rng.normal(0, 1, N6)
always = rng.random(N6) < sig(1.2 * u6 - 1.6)
never = (~always) & (rng.random(N6) < sig(-1.2 * u6 - 1.6))
comply = (~always) & (~never)
d6 = np.where(always, 1.0, np.where(never, 0.0, z6))
y6 = 2.0 * d6 + 1.5 * u6 + rng.normal(0, 1.0, N6)
print(" 배정은 무작위이고 실제 복용은 사람이 정합니다. 참 효과는 2.0 입니다")
print(" u 가 큰 사람은 배정과 무관하게 받고 작은 사람은 배정과 무관하게 안 받습니다")
print(" %s %s %s" % (pw("사람의 종류", 20), rw("비율", 12), rw("u 의 평균", 14)))
for nm, m in [("언제나 받는 사람", always), ("따르는 사람", comply),
("절대 안 받는 사람", never)]:
print(" %s %12.4f %14.4f"
% (pw(nm, 20), float(m.mean()), float(u6[m].mean())))
print(" %s %s %s" % (pw("무엇으로 세는가", 26), rw("추정값", 14), rw("무엇을 추정", 24)))
itt = float(y6[z6 == 1].mean() - y6[z6 == 0].mean())
pp = float(y6[d6 == 1].mean() - y6[d6 == 0].mean())
rate = float(d6[z6 == 1].mean() - d6[z6 == 0].mean())
late = itt / rate
print(" %s %14.6f %s" % (pw("배정된 대로", 26), itt, rw("배정의 효과", 24)))
print(" %s %14.6f %s" % (pw("실제 받은 대로", 26), pp, rw("아무것도 아님", 24)))
print(" %s %14.6f %s" % (pw("배정의 효과를 순응률로 나눔", 26), late,
rw("따르는 사람의 효과", 24)))
print(" 순응률 차이는 %.6f 이고 실제 따르는 사람의 비율은 %.6f 입니다"
% (rate, float(comply.mean())))
print(" 실제 받은 대로 세면 언제나 받는 사람이 처치군에 몰려 위로 치우칩니다")
print(" 배정의 효과를 순응률로 나누면 따르는 사람에게서의 효과가 나옵니다")
print(" 이것이 도구변수의 특수한 경우입니다")
print(" %s %s" % (pw("사람의 종류", 20), rw("무엇을 하는가", 30)))
for a, b in [("따르는 사람", "배정된 대로 합니다"),
("언제나 받는 사람", "배정과 무관하게 받습니다"),
("절대 안 받는 사람", "배정과 무관하게 안 받습니다"),
("청개구리", "배정과 반대로 합니다")]:
print(" %s %s" % (pw(a, 20), rw(b, 30)))
print(" 청개구리가 없다고 가정해야 나눗셈이 뜻을 갖습니다. 195강에서 다룹니다")
print(" 가운데 둘은 배정이 실제 처치를 안 바꾸므로 효과에 기여하지 않습니다")
print(" 순응률이 낮으면 표본이 훨씬 많이 듭니다")
print(" %s %s %s %s" % (pw("순응률", 12), rw("배정의 효과", 14),
rw("필요한 n", 14), rw("완전 순응 대비", 16)))
n_full = 2.0 * (za + zb) ** 2 / 0.5 ** 2
for c in [1.0, 0.8, 0.6, 0.5, 0.4, 0.2]:
d_eff = 0.5 * c
nn = 2.0 * (za + zb) ** 2 / d_eff ** 2
print(" %s %14.4f %14.0f %16.4f"
% (pw("%.1f" % c, 12), d_eff, np.ceil(nn), np.ceil(nn) / np.ceil(n_full)))
print(" 순응률이 절반이면 표본이 네 배 듭니다. 효과가 절반으로 희석되기 때문입니다")
print(" 183강 문제 2 의 제곱 반비례가 여기서도 그대로입니다")
# --- 문제 5: 중간에 들여다보기 ------------------------------------------
print(" 실험 도중 결과를 보고 싶어집니다")
print(" 178강 심화 4 에서 그러면 오류율이 오른다고 했습니다")
R7 = 30000
print(" 효과가 0 인 자료를 다섯 시점에서 보고 유의하면 멈춥니다")
print(" %s %s %s %s" % (pw("멈추는 규칙", 26), rw("실제 오류율", 14),
rw("목표", 10), rw("판정", 12)))
za5 = 1.959964
ob = 2.040 / np.sqrt(np.arange(1, 6) / 5.0)
poc = 2.413
for nm, thr in [("매번 1.96", np.full(5, za5)),
("포콕", np.full(5, poc)),
("오브라이언-플레밍", ob)]:
hit = 0
for _ in range(R7):
s = 0.0
stop = False
for k in range(5):
s += rng.normal(0, 1, 1)[0] * np.sqrt(1.0)
zk = s / np.sqrt(k + 1.0)
if abs(zk) > thr[k]:
stop = True
break
if stop:
hit += 1
v = hit / R7
print(" %s %14.4f %10.2f %s"
% (pw(nm, 26), v, 0.05, rw("좋음" if abs(v - 0.05) < 0.01 else "나쁨", 12)))
print(" 매번 1.96 을 쓰면 0.14 근처가 됩니다. 다섯 번 봤기 때문입니다")
print(" 포콕과 오브라이언-플레밍은 둘 다 목표를 지킵니다")
print(" 포콕은 매번 같은 기준 2.4130 을 쓰고 오브라이언-플레밍은 초반에 아주 엄격합니다")
print(" 오브라이언-플레밍의 기준은 %s 입니다"
% " ".join("%.4f" % v for v in ob))
print(" 두 방식이 무엇을 사고 무엇을 파는지 봅니다")
print(" %s %s %s %s" % (pw("멈추는 규칙", 26), rw("첫 시점 기준", 14),
rw("마지막 기준", 14), rw("무엇이 좋은가", 22)))
print(" %s %14.4f %14.4f %s"
% (pw("포콕", 26), poc, poc, rw("조기 종료가 쉬움", 22)))
print(" %s %14.4f %14.4f %s"
% (pw("오브라이언-플레밍", 26), ob[0], ob[-1], rw("끝까지 가면 손해 적음", 22)))
print(" 마지막 기준이 %.4f 라 최종 분석에서 1.96 보다 조금만 엄격합니다" % ob[-1])
print(" 임상시험이 오브라이언-플레밍을 표준으로 쓰는 이유입니다")
print(" 조기 종료한 실험의 효과는 부풀어 있습니다")
R8 = 40000
print(" 참 효과가 0.15 인 자료를 다섯 시점에서 보고 오브라이언-플레밍으로 멈춥니다")
print(" %s %s %s %s" % (pw("어디서 멈췄는가", 20), rw("몇 번 그랬는가", 16),
rw("그때 추정한 효과", 18), rw("참값", 10)))
nper = 40
stopped = {k: [] for k in range(5)}
final = []
for _ in range(R8):
tot, cnt = 0.0, 0
done = False
for k in range(5):
tot += rng.normal(0.15 * np.sqrt(nper), 1.0, 1)[0]
cnt += 1
zk = tot / np.sqrt(cnt)
est = zk / np.sqrt(cnt * nper)
if abs(zk) > ob[k]:
stopped[k].append(est)
done = True
break
if not done:
final.append(est)
for k in range(5):
if stopped[k]:
print(" %s %16d %18.6f %10.2f"
% (pw("%d 번째 시점" % (k + 1), 20), len(stopped[k]),
float(np.mean(stopped[k])), 0.15))
print(" %s %16d %18.6f %10.2f"
% (pw("끝까지 감", 20), len(final), float(np.mean(final)), 0.15))
allv = np.concatenate([np.array(stopped[k]) for k in range(5) if stopped[k]] +
[np.array(final)])
print(" 전체 평균은 %.6f 이고 참값은 0.15 입니다" % float(allv.mean()))
print(" 일찍 멈춘 실험일수록 효과가 크게 부풀어 있습니다")
print(" 183강 문제 3 의 승자의 저주이며 여기서는 시간축을 따라 일어납니다")
print(" 그래서 조기 종료한 시험의 효과 크기는 보정해서 보고해야 합니다")
print(" 실험 설계에서 미리 정할 것을 정리합니다")
print(" %s %s" % (pw("무엇", 24), rw("왜 미리 정해야 하는가", 30)))
for a, b in [("주 지표", "182강 문제 5 의 보정을 피합니다"),
("표본 크기", "183강의 검출력을 확보합니다"),
("배정 방식", "분석에도 같은 구조를 씁니다"),
("멈추는 규칙", "알파를 미리 나눠 씁니다"),
("탈락 처리", "191강 문제 4 의 선택편향을 막습니다"),
("분석 계획", "189강 문제 3 의 선택을 막습니다")]:
print(" %s %s" % (pw(a, 24), rw(b, 30)))
print(" 전부 자료를 보기 전에 정해 등록합니다. 178강부터 되풀이된 원칙입니다")
print(" 무작위 배정은 강력하지만 그것만으로 충분한 적이 한 번도 없습니다")
# 191강 문제 2 에서 작은 실험의 불균형을 봤습니다. 배정 방식으로 줄입니다
# 표본 40 명이고 예후 변수 x 가 결과에 강하게 영향을 줍니다
# 배정 방식 처치군 수의 표준편차 x 불균형의 sd 추정값의 sd 기준 대비
# 동전 던지기 3.1443 0.2742 0.8817 1.0000
# 순열 배정 0.0000 0.2741 0.8781 0.9960
# 도착 순서로 블록 0.0000 0.2823 0.9065 1.0282
# x 순으로 블록 0.0000 0.0675 0.3751 0.4254
# 짝지어 배정 0.0000 0.0368 0.3378 0.3831
# 동전 던지기는 인원수부터 흔들립니다. 표준편차가 3.17 명입니다
# 순열 배정은 인원수를 정확히 반으로 맞춥니다
# 도착 순서로 블록을 나누면 x 불균형은 순열과 거의 같습니다
# 블록이 x 와 무관하므로 x 쪽으로는 아무것도 안 해 줍니다
# x 순으로 블록을 나누거나 짝을 지으면 x 불균형이 크게 줄어듭니다
# 무엇으로 묶느냐가 정합니다. 예후 변수로 묶어야 이득이 있습니다
# 배정에 쓴 구조를 분석에도 넣어야 합니다
# 짝지어 배정한 자료를 두 가지로 분석해 봅니다
# 분석 방법 추정값 평균 추정값의 sd 표준오차 평균 실제 포함률
# t 만 넣음 1.9975 0.3311 0.8840 1.0000
# t 와 x 를 넣음 1.9976 0.3121 0.3139 0.9458
# 둘 다 참값 2.0 에 닿습니다. 무작위였으므로 불편입니다
# x 를 넣으면 표준오차가 크게 줄고 포함률도 목표에 붙습니다
# t 만 넣으면 표준오차가 참 흔들림보다 커서 구간이 지나치게 넓습니다
# 183강의 표본 크기 계산이 실험 설계 전체로 넓어집니다
# 무엇을 정하는가 어디서 오는가 정하면 무엇이 따라오는가
# 의미 있는 최소 효과 비용과 도메인 표본 크기
# 결과 변수 무엇을 개선하려는가 분산과 검출력
# 배정 단위 간섭이 있는가 군집 설계효과
# 추적 기간 효과가 언제 나타나는가 탈락률
# 주 지표 하나 가장 중요한 물음 보정 필요 없음
# 183강 문제 5 의 다섯 줄이 그대로입니다. 첫째 줄만 통계가 아닙니다
# 결과 변수를 무엇으로 두느냐가 표본을 크게 바꿉니다
# 같은 처치를 세 가지 결과로 잽니다. 참 효과는 모두 같은 자리에서 옵니다
# 결과 변수 처치군 평균 대조군 평균 표준화 효과 필요한 n
# 연속값 그대로 0.397643 -0.001994 0.399319 99
# 0.5 를 넘는가 0.459257 0.308546 0.313680 160
# 2.0 을 넘는가 0.054898 0.022398 0.169213 549
# 같은 처치인데 결과를 어떻게 재느냐로 필요한 표본이 크게 달라집니다
# 연속값을 문턱으로 잘라 이진으로 만들면 정보를 버립니다
# 문턱이 극단으로 갈수록 더 많이 버립니다. 181강 심화 4 와 같은 이야기입니다
# 배정 단위를 개인이 아니라 뭉치로 두면 표본이 더 듭니다
# 뭉치 크기 급내상관 설계효과 필요한 사람 수
# 1 0.00 1.0000 175
# 10 0.02 1.1800 206
# 30 0.02 1.5800 276
# 30 0.05 2.4500 428
# 100 0.05 5.9500 1038
# 173강 문제 3 의 설계효과가 그대로 곱해집니다
# 뭉치 100 에 급내상관 0.05 면 다섯 배가 넘게 듭니다
# 배정 단위는 간섭이 있는지가 정합니다. 교실이나 매장 단위가 흔합니다
# 누가 무엇을 받았는지 알면 결과가 달라집니다
# 누구를 가리는가 무엇을 막는가 이름
# 참가자 기대에 따른 반응 단일 눈가림
# 참가자와 시행자 다르게 대하는 것 이중 눈가림
# 평가자까지 평가의 치우침 삼중 눈가림
# 분석자까지 분석 선택의 치우침 네 겹 눈가림
# 마지막 줄이 요즘 강조됩니다. 189강 문제 3 의 선택 문제 때문입니다
# 눈가림이 깨지면 얼마나 나빠지는지 봅니다
# 참 효과는 1.0 이고 자기가 처치군인 줄 알면 0.6 만큼 더 좋게 답합니다
# 눈가림 상태 추정값 평균 참값 치우침
# 완전히 가림 1.0030 1.0 0.0030
# 10 퍼센트가 알아챔 1.0669 1.0 0.0669
# 절반이 알아챔 1.2957 1.0 0.2957
# 다 알아챔 1.5996 1.0 0.5996
# 알아채는 비율에 비례해 치우침이 커집니다
# 위약을 쓰면 대조군도 무언가를 받으므로 알아채기 어려워집니다
# 위약 반응 자체를 재려면 세 팔이 필요합니다
# 아무것도 안 함 대 위약 대 진짜 처치를 나눕니다
# 무엇과 무엇을 견주는가 차이 무엇을 재는가
# 위약 대 아무것도 안 함 0.502065 위약 반응
# 처치 대 위약 1.001776 약 자체의 효과
# 처치 대 아무것도 안 함 1.503841 둘을 합친 것
# 두 팔만 있으면 둘째 줄만 잽니다. 그것이 대개 알고 싶은 값입니다
# 위약 반응 자체가 관심이면 세 팔이 필요합니다
# 배정한 대로 안 따르는 사람이 있습니다
# 배정은 무작위이고 실제 복용은 사람이 정합니다. 참 효과는 2.0 입니다
# u 가 큰 사람은 배정과 무관하게 받고 작은 사람은 배정과 무관하게 안 받습니다
# 사람의 종류 비율 u 의 평균
# 언제나 받는 사람 0.2215 0.7586
# 따르는 사람 0.5826 -0.0012
# 절대 안 받는 사람 0.1959 -0.8575
# 무엇으로 세는가 추정값 무엇을 추정
# 배정된 대로 1.163759 배정의 효과
# 실제 받은 대로 3.006845 아무것도 아님
# 배정의 효과를 순응률로 나눔 1.996070 따르는 사람의 효과
# 순응률 차이는 0.583025 이고 실제 따르는 사람의 비율은 0.582553 입니다
# 실제 받은 대로 세면 언제나 받는 사람이 처치군에 몰려 위로 치우칩니다
# 배정의 효과를 순응률로 나누면 따르는 사람에게서의 효과가 나옵니다
# 이것이 도구변수의 특수한 경우입니다
# 사람의 종류 무엇을 하는가
# 따르는 사람 배정된 대로 합니다
# 언제나 받는 사람 배정과 무관하게 받습니다
# 절대 안 받는 사람 배정과 무관하게 안 받습니다
# 청개구리 배정과 반대로 합니다
# 청개구리가 없다고 가정해야 나눗셈이 뜻을 갖습니다. 195강에서 다룹니다
# 가운데 둘은 배정이 실제 처치를 안 바꾸므로 효과에 기여하지 않습니다
# 순응률이 낮으면 표본이 훨씬 많이 듭니다
# 순응률 배정의 효과 필요한 n 완전 순응 대비
# 1.0 0.5000 63 1.0000
# 0.8 0.4000 99 1.5714
# 0.6 0.3000 175 2.7778
# 0.5 0.2500 252 4.0000
# 0.4 0.2000 393 6.2381
# 0.2 0.1000 1570 24.9206
# 순응률이 절반이면 표본이 네 배 듭니다. 효과가 절반으로 희석되기 때문입니다
# 183강 문제 2 의 제곱 반비례가 여기서도 그대로입니다
# 실험 도중 결과를 보고 싶어집니다
# 178강 심화 4 에서 그러면 오류율이 오른다고 했습니다
# 효과가 0 인 자료를 다섯 시점에서 보고 유의하면 멈춥니다
# 멈추는 규칙 실제 오류율 목표 판정
# 매번 1.96 0.1452 0.05 나쁨
# 포콕 0.0492 0.05 좋음
# 오브라이언-플레밍 0.0508 0.05 좋음
# 매번 1.96 을 쓰면 0.14 근처가 됩니다. 다섯 번 봤기 때문입니다
# 포콕과 오브라이언-플레밍은 둘 다 목표를 지킵니다
# 포콕은 매번 같은 기준 2.4130 을 쓰고 오브라이언-플레밍은 초반에 아주 엄격합니다
# 오브라이언-플레밍의 기준은 4.5616 3.2255 2.6336 2.2808 2.0400 입니다
# 두 방식이 무엇을 사고 무엇을 파는지 봅니다
# 멈추는 규칙 첫 시점 기준 마지막 기준 무엇이 좋은가
# 포콕 2.4130 2.4130 조기 종료가 쉬움
# 오브라이언-플레밍 4.5616 2.0400 끝까지 가면 손해 적음
# 마지막 기준이 2.0400 라 최종 분석에서 1.96 보다 조금만 엄격합니다
# 임상시험이 오브라이언-플레밍을 표준으로 쓰는 이유입니다
# 조기 종료한 실험의 효과는 부풀어 있습니다
# 참 효과가 0.15 인 자료를 다섯 시점에서 보고 오브라이언-플레밍으로 멈춥니다
# 어디서 멈췄는가 몇 번 그랬는가 그때 추정한 효과 참값
# 1 번째 시점 8 0.755119 0.15
# 2 번째 시점 1172 0.404341 0.15
# 3 번째 시점 5266 0.280606 0.15
# 4 번째 시점 7992 0.213630 0.15
# 5 번째 시점 7499 0.171923 0.15
# 끝까지 감 18063 0.088028 0.15
# 전체 평균은 0.163606 이고 참값은 0.15 입니다
# 일찍 멈춘 실험일수록 효과가 크게 부풀어 있습니다
# 183강 문제 3 의 승자의 저주이며 여기서는 시간축을 따라 일어납니다
# 그래서 조기 종료한 시험의 효과 크기는 보정해서 보고해야 합니다
# 실험 설계에서 미리 정할 것을 정리합니다
# 무엇 왜 미리 정해야 하는가
# 주 지표 182강 문제 5 의 보정을 피합니다
# 표본 크기 183강의 검출력을 확보합니다
# 배정 방식 분석에도 같은 구조를 씁니다
# 멈추는 규칙 알파를 미리 나눠 씁니다
# 탈락 처리 191강 문제 4 의 선택편향을 막습니다
# 분석 계획 189강 문제 3 의 선택을 막습니다
# 전부 자료를 보기 전에 정해 등록합니다. 178강부터 되풀이된 원칙입니다
# 무작위 배정은 강력하지만 그것만으로 충분한 적이 한 번도 없습니다