로지스틱 회귀 전력 분석 시뮬레이션-설계 실험


39

이 질문은에 관해서 @Greg 눈에 의해 주어진 답변에 대한 응답이다 질문 내가 로지스틱 회귀 및 SAS와 전력 분석에 관한 질문 Proc GLMPOWER.

실험을 설계 중이고 요인 로지스틱 회귀 분석으로 결과를 분석 할 경우 시뮬레이션 (및 여기 )을 사용하여 검정력 분석을 수행하려면 어떻게해야합니까?

다음은 두 개의 변수가있는 간단한 예입니다. 첫 번째는 가능한 세 가지 값 {0.03, 0.06, 0.09}을 취하고 두 번째는 더미 표시기 {0,1}입니다. 각각에 대해 각 조합 (응답자 수 / 마케팅 된 사람 수)에 대한 응답 속도를 추정합니다. 또한, 우리는 첫 번째 조합이 시도되고 진정한 버전이기 때문에 첫 번째 조합이 다른 것보다 같을 것입니다 (같은 것으로 간주 될 수 있음). 이것은 링크 된 질문에 언급 된 SAS 과정에서 제공 된 것과 같은 설정입니다.

여기에 이미지 설명을 입력하십시오

결과를 분석하는 데 사용되는 모형은 주요 효과와 상호 작용이있는 로지스틱 회귀입니다 (응답은 0 또는 1 임).

mod <- glm(response ~ Var1 + Var2 + I(Var1*Var2))

전력 분석을 수행하기 위해이 모델에 사용할 데이터 세트를 시뮬레이션하려면 어떻게해야합니까?

SAS를 통해 이것을 실행할 때 Proc GLMPOWER( p는 표시된 응답 속도의 가중 평균에 STDDEV =0.05486016 해당하는 사용 sqrt(p(1-p))) :

data exemplar;
  input Var1 $ Var2 $ response weight;
  datalines;
    3 0 0.0025  3
    3 1 0.00395 1
    6 0 0.003   1
    6 1 0.0042  1
    9 0 0.0035  1
    9 1 0.002   1;
run;

proc glmpower data=exemplar;
  weight weight;
  class Var1 Var2;
  model response = Var1 | Var2;
  power
    power=0.8
    ntotal=.
    stddev=0.05486016;
run;

참고 : GLMPOWER클래스 (공칭) 변수 만 사용하므로 위의 3, 6, 9는 문자로 취급되며 낮음, 중간 및 높음 또는 다른 세 문자열 일 수 있습니다. 실제 분석이 수행 될 때 Var1은 모든 곡률을 설명하기 위해 숫자로 사용됩니다 (그리고 우리는 다항식 Var1 * Var1을 포함 할 것입니다).

SAS의 출력은

여기에 이미지 설명을 입력하십시오

따라서 검정력이 0.80이고 알파가 0.05 인 표본 크기 (Var2 주 효과는 추정하기가 가장 어렵다)로 762,112가 필요하다는 것을 알 수 있습니다. 우리는 이것을 기준선 조합 (즉, 0.375 * 762112)의 3 배가되고 나머지는 다른 5 개의 조합과 동일하게되도록 할당 할 것입니다.


R의 첫 번째 질문 : 모든 경우의 75 %가 다른 모든 콤보의 경우 {var1 = .03, var2 = 0} & 25 %, 1의 경우 3 단위가 아니라고 가정합니다. 각각의 다른 콤보 단위 (37.5 %)? 두 번째 질문, 당신이 감지하고자하는 효과를 지정할 수 있습니까? 즉, 1 대 0의 로그 확률은 무엇입니까? var1이 .01 증가하면 성공 확률이 어떻게 변해야합니까? 상호 작용이있을 수 있다고 생각합니까 (그렇다면 얼마나 큰가)? (NB,이 Q는 대답하기 어려울 수 있습니다. 하나의 전략은 각 콤보에있을 것으로 생각되는 1의 비율을 지정하는 것입니다.)
gung-Reinstate Monica

1 차 : 기준 사례의 가중치 3은 {var1 = 0.03, var2 = 0} 인 경우의 3 배입니다. 따라서 SAS의 결과 (주요 효과를 거부하는 80 % 검정력을 갖기 위해서는 762,112 개의 전체 표본 크기가 필요합니다. var2 = 0이므로 필요한 총 표본 크기)는이 기준 사례에 37.5 %가 할당됩니다.
B_Miner

두 번째 : 응답 속도 (시험 횟수 대비 성공 횟수의 예상 비율) 만 있으면됩니다. 따라서 Var1 = 0.03 및 Var2 = 0으로 1,000 개의 문자를 보내면 신용 카드 다이렉트 메일 오퍼의 0.03 (3 %)에 대한 이자율 제안에 해당하고 봉투에 스티커가 없습니다 (Var2 = 1은 스티커), 우리는 1000 * 0.0025 응답을 기대합니다.
B_Miner

2 차 계속 : 우리는 상호 작용을 기대합니다 – 따라서 반응률. Var1의 값에 따라 Var2 = 0의 응답 속도가 다릅니다. 확률을 기록한 다음 시뮬레이션 된 데이터 세트로 변환하는 방법을 잘 모르겠습니다.
B_Miner

그러나 마지막 것입니다. var2 = 0 (예 : .25 %, .30 %, .35 %) 인 경우 var1에 대한 응답 속도는 선형입니다. 이것이 선형 효과 또는 곡선이 되려고 했습니까? 확률이 범위의 작은 하위 집합에 대해 상당히 선형으로 보일 수 있지만 실제로는 선형 일 수는 없습니다. 로지스틱 회귀는 확률이 아닌 로그 확률에서 선형 적입니다 ( 여기서 내 대답에서 그런 것들에 대해 이야기 합니다 )
gung-복직 모니카

답변:


43

예비 :

  • G * Power 설명서 에서 설명한 것처럼 해결하려는 항목에 따라 여러 가지 유형의 전력 분석이 있습니다. (즉, , 효과 크기 , 및 power는 서로 관련되어 있습니다.이 중 세 가지를 지정하면 네 번째를 풀 수 있습니다.) E S αNESα

    • 설명에서 및 power = 80 %로 지정한 응답 속도를 캡처 하는 적절한 을 알고 싶습니다 . 이것은 우선권 입니다. α = .05Nα=.05
    • 우리는 post-hoc power ( , response rate, & alpha가 주어진 결정 힘 )로 시작하여 개념적으로 더 간단 할 수 있습니다.N
  • @GregSnow의 우수한 게시물 외에도 CV에 대한 시뮬레이션 기반 전력 분석에 대한 또 다른 훌륭한 안내서는 여기에서 찾을 수 있습니다 . 통계 전력 계산 . 기본 아이디어를 요약하려면 :

    1. 당신이 감지 할 수있는 효과를 파악
    2. 그 가능한 세계에서 N 데이터를 생성
    3. 그러한 가짜 데이터에 대해 수행하려는 분석을 실행하십시오.
    4. 선택한 알파에 따라 결과가 '유의한지'저장
    5. 여러 번 ( ) 반복 하고 그 에서 (사후) 전력의 추정값으로 '유의 한 %'를 사용합니다NBN
    6. 사전 전력을 결정하려면 가능한 검색 하여 원하는 전력을 산출하는 값을 찾으십시오. N
  • 특정 반복에 대한 중요성을 찾을 수 있는지 여부는 확률 (여기서 는 거듭 제곱) 인 Bernoulli 시행의 결과로 이해 될 수 있습니다 . 반복 에서 찾은 비율을 통해 실제 를 근사 할 수 있습니다 . 더 나은 근사값을 얻으려면 를 늘릴 수 있지만 시뮬레이션 시간이 더 오래 걸립니다. p B p BppBpB

  • R에서, 주어진 '성공'확률로 이진 데이터를 생성하는 주요 방법은 ? rbinom입니다.

    • 예를 들어 확률이 p 인 10 개의 Bernoulli 시행에서 성공 횟수를 얻으려면 코드는 다음 rbinom(n=10, size=1, prob=p)과 같습니다 (결과를 저장을 위해 변수에 할당하려고합니다)
    • ? runif 를 사용하여 이러한 데이터를 덜 우아하게 생성 할 수도 있습니다 .ifelse(runif(1)<=p, 1, 0)
    • 결과가 잠재 가우스 변수에 의해 중재된다고 생각되면 ? rnorm 과 공분산의 함수로 잠재 변수를 생성 한 다음 결과를 확률로 변환 pnorm()하여 rbinom()코드 에서 사용할 수 있습니다.
  • "모든 곡률을 설명하기 위해 다항식 Var1 * Var1을 포함 시키십시오"라고 명시합니다. 여기에는 혼란이 있습니다. 다항식 항은 곡률을 설명하는 데 도움이 될 수 있지만 이는 상호 작용 항입니다.이 방법으로는 도움이되지 않습니다. 그럼에도 불구하고 귀하의 응답률은 모델에 제곱 항과 교호 작용 항을 모두 포함해야합니다. 구체적으로, 모델에는 기본 항을 넘어 , 및 합니다. v a r 1 v a r 2 v a r 1 2v a r 2var12var1var2var12var2

  • 다른 질문의 맥락에서 작성되었지만 여기에 대한 대답 : 로짓과 프로 빗 모델의 차이점 에는 이러한 유형의 모델에 대한 많은 기본 정보가 있습니다.
  • 여러 종류가 있습니다 것처럼 유형 I 오류율 여러 가설 (예를 들어, 거기에 별 대비 오류율 , familywise 오류율 , 당 가족 에러율 ), 그래서 전력 *의이 다른 종류 (예를 들어,에 있습니다 하나의 미리 지정된 효과 , 모든 효과모든 효과 ). 또한 특정 효과 조합을 탐지하는 힘을 찾거나 모델 전체를 동시에 테스트하는 힘을 구할 수도 있습니다. SAS 코드에 대한 귀하의 설명에서 나는 그것이 후자를 찾고 있다는 것입니다. 그러나 귀하의 상황에 대한 설명에서 최소한 상호 작용 효과를 감지하고 싶다고 가정합니다.

  • 검정력과 관련된 문제를 생각하는 다른 방법은 여기에서 내 대답을 참조하십시오 . 표본 크기를 정당화하는 맥락에서 상관 관계를 추정 할 때 일반적인 정밀도를보고하는 방법.

R의 로지스틱 회귀 분석을위한 간단한 사후 처리 능력 :

긍정적 인 반응 속도는 세계의 실제 상황을 나타내며 10,000 개의 문자를 보냈다고 가정 해 봅시다. 이러한 영향을 감지하는 힘은 무엇입니까? (저는 "코믹하게 비효율적 인"코드를 작성하는 것으로 유명합니다. 다음은 효율성을 위해 최적화 된 것이 아니라 따르기 쉽게하기위한 것입니다. 실제로 속도는 느립니다.)

set.seed(1)

repetitions = 1000
N = 10000
n = N/8
var1  = c(   .03,    .03,    .03,    .03,    .06,    .06,    .09,   .09)
var2  = c(     0,      0,      0,      1,      0,      1,      0,     1)
rates = c(0.0025, 0.0025, 0.0025, 0.00395, 0.003, 0.0042, 0.0035, 0.002)

var1    = rep(var1, times=n)
var2    = rep(var2, times=n)
var12   = var1**2
var1x2  = var1 *var2
var12x2 = var12*var2

significant = matrix(nrow=repetitions, ncol=7)

startT = proc.time()[3]
for(i in 1:repetitions){
  responses          = rbinom(n=N, size=1, prob=rates)
  model              = glm(responses~var1+var2+var12+var1x2+var12x2, 
                           family=binomial(link="logit"))
  significant[i,1:5] = (summary(model)$coefficients[2:6,4]<.05)
  significant[i,6]   = sum(significant[i,1:5])
  modelDev           = model$null.deviance-model$deviance
  significant[i,7]   = (1-pchisq(modelDev, 5))<.05
}
endT = proc.time()[3]
endT-startT

sum(significant[,1])/repetitions      # pre-specified effect power for var1
[1] 0.042
sum(significant[,2])/repetitions      # pre-specified effect power for var2
[1] 0.017
sum(significant[,3])/repetitions      # pre-specified effect power for var12
[1] 0.035
sum(significant[,4])/repetitions      # pre-specified effect power for var1X2
[1] 0.019
sum(significant[,5])/repetitions      # pre-specified effect power for var12X2
[1] 0.022
sum(significant[,7])/repetitions      # power for likelihood ratio test of model
[1] 0.168
sum(significant[,6]==5)/repetitions   # all effects power
[1] 0.001
sum(significant[,6]>0)/repetitions    # any effect power
[1] 0.065
sum(significant[,4]&significant[,5])/repetitions   # power for interaction terms
[1] 0.017

따라서 10,000 개의 문자가 이러한 응답 속도를 감지하기 위해 실제로 80 %의 전력을 얻지는 못합니다. (이러한 접근 방식 간의 명백한 불일치를 설명하기 위해 SAS 코드가 무엇을하는지 충분히 확신하지 못하지만이 코드는 개념적으로 간단하지만 느리다면 확인하는 데 시간이 많이 걸렸습니다. 결과는 합리적입니다.)

로지스틱 회귀 분석을위한 시뮬레이션 기반 사전 우선권 :

여기에서 아이디어는 원하는 전력 유형의 원하는 수준을 산출하는 값을 찾을 때까지 가능한 을 검색 하는 것입니다. 이론). 이러한 작은 효과를 포착하기 위해 이 필요하다는 것을 감안할 때, 더 효율적으로 수행하는 방법에 대해 생각할 가치가 있습니다. 나의 전형적인 접근법은 단순히 무차별적인 힘이다. 즉, 내가 합리적으로 고려할 수있는 각각의 을 평가하는 것이다. (그러나, 나는 일반적으로 작은 범위만을 고려할 것이며, 적어도 이것과 비교하여 일반적으로 매우 작은 으로 작업하고 있습니다.) N N NNNNN

대신, 나의 전략은 가능한 을 괄호 로 묶어 전력의 범위를 파악하는 것이 었습니다. 따라서 을 500,000으로 선택 하고 코드를 다시 실행했습니다 (동일한 시드를 시작하는 데 1 시간 30 분이 걸렸습니다). 결과는 다음과 같습니다. NNN

sum(significant[,1])/repetitions      # pre-specified effect power for var1
[1] 0.115
sum(significant[,2])/repetitions      # pre-specified effect power for var2
[1] 0.091
sum(significant[,3])/repetitions      # pre-specified effect power for var12
[1] 0.059
sum(significant[,4])/repetitions      # pre-specified effect power for var1X2
[1] 0.606
sum(significant[,5])/repetitions      # pre-specified effect power for var12X2
[1] 0.913
sum(significant[,7])/repetitions      # power for likelihood ratio test of model
[1] 1
sum(significant[,6]==5)/repetitions   # all effects power
[1] 0.005
sum(significant[,6]>0)/repetitions    # any effect power
[1] 0.96
sum(significant[,4]&significant[,5])/repetitions   # power for interaction terms
[1] 0.606

이를 통해 효과의 크기가 상당히 다양하므로이를 감지하는 능력이 다양하다는 것을 알 수 있습니다. 예를 들어, 의 효과는 감지하기가 특히 어려우며 5 억 개의 문자로도 시간의 6 %에 불과합니다. 반면에 모델 전체는 항상 null 모델보다 훨씬 낫습니다. 다른 가능성은 사이에 배열됩니다. 대부분의 '데이터'는 각 반복마다 버려지지만 여전히 약간의 탐색이 가능합니다. 예를 들어, 행렬을 사용하여 다른 변수의 확률이 유의 한 상관 관계를 평가할 수 있습니다 . var12significant

결론적으로, 복잡한 상황 과 큰 이 귀하의 상황에 수반 되었기 때문에 이것은 초기 의견에서 의심 / 주장한 것처럼 간단하지 않았습니다. 그러나 여기에 넣은 내용을 통해 일반적인 방법과 전력 분석과 관련된 문제에 대한 아이디어를 얻을 수 있습니다. HTH. N


Gung-WOW는 자세하고 세심한 답변을 해주셔서 감사합니다! 내 자신의 코드를 작성하고 코드를 가지고 연주 할 때 모형에서 고려하지 않고 훨씬 작은 표본 크기로 80 % 이상의 검정력을 얻을 수 있기 때문에 2 차 항이 문제로 보입니다.
B_Miner

1
@B_Miner가 훌륭합니다. 여러분이하고 싶은 일입니다. 게다가 시뮬레이션 기반의 접근 방식이 분석 소프트웨어보다 우수하다고 생각하는 이유도 바로 여기 있습니다 (R은 pwr패키지도 있습니다). 이 접근법은 당신이 일어날 것으로 예상되는 것, 어떻게 처리 할 것인지 등에 대해 훨씬 더 명확하게 생각할 수있는 기회를 제공합니다. 유사하게, 당신의 포지티브 비율이 맞다면 b / c는 선형이 아니며 상호 작용만으로는 곡선 적 관계를 포착 할 수 없습니다.
gung-복직 모니카

나는 polyR을 처음 사용하는 사용자들에게 오류가 발생하기 쉬운 원시 값을 제곱하는 전략을 보여주기보다 사용을 시연해야한다고 생각 합니다. 나는 전체 모델이로 간주되어야한다고 생각한다 glm(responses~ poly(var1, 2) * var2, family=binomial(link="logit"). 해석상의 통계적 오류가 적고 훨씬 작습니다. 전반적인 상황 만보고있을 때이 정확한 경우에는 중요하지 않을 수 있지만 개별 용어를보고 싶은 유혹적인 사용자를 쉽게 오도 할 수 있습니다.
DWin

@DWin, R을 사용하여 CV에 대한 설명을 할 때 R이 아닌 방식으로 수행합니다. 아이디어는 R / w에 익숙하지 않은 사람들에게는 가능한 한 투명해야합니다. 예를 들어, 나는 벡터화 가능성을 사용하지 않고 루프를 사용하고 있습니다 =. poly()R 사용자가 아닌 경우 클래스가 무엇인지 알지 못합니다.
gung-모니 티 복원

17

@ 궁의 대답은 이해하기에 좋습니다. 내가 사용할 접근법은 다음과 같습니다.

mydat <- data.frame( v1 = rep( c(3,6,9), each=2 ),
    v2 = rep( 0:1, 3 ), 
    resp=c(0.0025, 0.00395, 0.003, 0.0042, 0.0035, 0.002) )

fit0 <- glm( resp ~ poly(v1, 2, raw=TRUE)*v2, data=mydat,
    weight=rep(100000,6), family=binomial)
b0 <- coef(fit0)


simfunc <- function( beta=b0, n=10000 ) {
    w <- sample(1:6, n, replace=TRUE, prob=c(3, rep(1,5)))
    mydat2 <- mydat[w, 1:2]
    eta <- with(mydat2,  cbind( 1, v1, 
                v1^2, v2,
                v1*v2,
                v1^2*v2 ) %*% beta )
    p <- exp(eta)/(1+exp(eta))
    mydat2$resp <- rbinom(n, 1, p)

    fit1 <- glm( resp ~ poly(v1, 2)*v2, data=mydat2,
        family=binomial)
    fit2 <- update(fit1, .~ poly(v1,2) )
    anova(fit1,fit2, test='Chisq')[2,5]
}

out <- replicate(100, simfunc(b0, 10000))
mean( out <= 0.05 )
hist(out)
abline(v=0.05, col='lightgrey')

이 함수는 v2의 전체 효과를 테스트하며 다른 유형의 테스트를 보도록 모델을 변경할 수 있습니다. 다른 것을 테스트하고 싶을 때 함수 인수를 변경할 수 있도록 함수로 작성하는 것이 좋습니다. 진행률 표시 줄을 추가하거나 병렬 패키지를 사용하여 작업 속도를 높일 수도 있습니다.

여기서는 단지 100 번의 복제를 수행했습니다. 일반적으로 그 수준을 중심으로 대략적인 샘플 크기를 찾은 다음 올바른 볼 파크에있을 때 이터 레이션을 증가시킵니다 (20 % 전력을 사용할 때 10,000 회 반복하여 시간을 낭비 할 필요가 없습니다).


고마워 그렉! 나는이 같은 접근법에 대해 궁금해했다. (당신이 한 일을 올바르게 이해하고 있다면). 확인하려면 : "mydat"를 기준으로 매우 큰 데이터 세트를 작성하고 있습니까 (실제로 Var1 및 Var2 값에 대한 개별 레코드를 작성하고 응답에 대해 1과 0을 작성하는 무차별 대입 대신 가중치를 사용함) 로지스틱 회귀 분석을 적용한 다음 시뮬레이션에서 제안 된 모델에서 샘플링하기 위해 해당 계수를 사용합니까? 이것이 계수를 만드는 일반적인 방법 인 것 같습니다. 그런 다음에 연결된 순서 회귀 전력에 대한 귀하의 반응과 같습니다.
B_Miner

초기 모델은 가중치를 사용하여 사용할 계수를 얻지 만 시뮬레이션에서는 n행이 있는 데이터 프레임을 만듭니다 . 함수에서 가중치를 수행하는 것이 더 효율적일 수 있습니다.
Greg Snow

사용 된 계수를 얻기 위해 처음에 데이터를 사용하고 (매우 좋은 견적을 얻는 데 큰 도움이 됨) 정확합니까?
B_Miner

그렇습니다. 큰 것은 가중치의 비례 배가 정수를 제공하도록하는 것입니다.
Greg Snow

2
@ B_Miner, 나는 기사를 계획하고 있는데, 전체 책이 충분하지 않다는 것을 모른다. 그러나 격려해 주셔서 감사합니다.
Greg Snow
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.