로지스틱 회귀 모델 조작


12

다음 코드가 수행하는 작업을 이해하고 싶습니다. 코드를 작성한 사람은 더 이상 여기서 작동하지 않으며 거의 ​​완전히 문서화되지 않았습니다. " 그것은 베이지안 로지스틱 회귀 모델입니다 "

bglm <- function(Y,X) {
    # Y is a vector of binary responses
    # X is a design matrix

    fit <- glm.fit(X,Y, family = binomial(link = logit))
    beta <- coef(fit)
    fs <- summary.glm(fit)
    M <- t(chol(fs$cov.unscaled))
    betastar <- beta + M %*% rnorm(ncol(M))
    p <- 1/(1 + exp(-(X %*% betastar)))
    return(runif(length(p)) <= p)
}

로지스틱 모형에 적합하고 추정 된 공분산 행렬의 Cholseky 분해를 전치하고 의 드로우 벡터를 곱한 다음 모형 추정치에 더합니다. 이것은 설계 행렬에 의해 미리 곱해지며, 이것의 역로 짓은 의 드로우 벡터 와 결과 이진 벡터가 반환 되는 것과 비교됩니다 . 그러나이 모든 것이 통계적으로 무엇을 의미 합니까?(0,1)(0,1)


이 필드가 어떤 필드에서 사용되고 있는지 아는 것이 도움이 될 것입니다.
naught101

2
본질적으로이 함수는 실제 매개 변수에 대한 불확실성을 통합하여 데이터의 (자주주의) 모델에서 데이터를 생성합니다. 베이지안 MCMC 루틴의 일부일 수도 있지만 시뮬레이션 기반 전력 분석 에도 사용될 수 있습니다 (nb, 불확실성을 고려하지 않은 이전 데이터를 기반으로 한 전력 분석 은 종종 낙관적 임).
gung-Monica Monica 복원

천만에요, @PSellaz. 아무도 응답하지 않았으므로 '공식적인'답변으로 바꾸겠습니다.
gung-Monica Monica 복원

답변:


7

함수의 기능 :
본질적으로 함수는 데이터 모델에서 새로운 의사 난수 응답 (예 : ) 데이터를 생성 합니다. 사용되는 모델은 표준 상용주의 모델입니다. 관례와 마찬가지로 * 데이터는 알려진 상수 라고 가정합니다 . 어떤 방식으로도 샘플링되지 않습니다. 이 함수의 중요한 기능으로 보는 것은 추정 된 매개 변수에 대한 불확실성을 통합한다는 것입니다. 와이엑스

* 인터셉트 (일반적으로 좋은 생각은 아님)를 억제하지 않으려면 함수에 입력하기 전에 행렬 의 가장 왼쪽 열로 의 벡터를 수동으로 추가해야합니다 .1엑스

이 기능의 요점은 무엇입니까?
솔직히 모르겠습니다. Bayesian MCMC 루틴의 일부일 수도 있지만 실제로는 베이지안 분석을 실행하기 위해 더 많은 코드가 필요합니다. 나는 이것을 베이지안 방법에 대해 충분히 전문적으로 느끼지 못하지만이 기능은 일반적으로 사용되는 것과 같은 느낌을주지 않습니다.

또한 시뮬레이션 기반 전력 분석에도 사용될 수있었습니다. ( 이 유형의 것에 대한 정보 는 로지스틱 회귀 전력 분석 시뮬레이션 설계 실험 에서 내 대답을 참조하십시오 .) 모수 추정치의 불확실성을 고려하지 않은 이전 데이터를 기반으로 한 전력 분석은 종종 가치가 있습니다. 낙관적입니다. (여기서 요점 : 원하는 효과 크기 대 예상 효과 크기 )

이 기능을 사용하려는 경우 :
@whuber가 주석에서 언급 한 것처럼이 기능은 비효율적입니다. 이 기능을 사용하여 (예를 들어) 전력 분석을 수행하려면 함수를 두 개의 새로운 함수로 나눕니다. 첫 번째는 데이터를 읽고 매개 변수와 불확실성을 출력합니다. 두 번째 새로운 함수는 새로운 의사 난수 데이터를 생성합니다 . 다음은 예입니다 (더 개선 할 수는 있지만). 와이

simulationParameters <- function(Y,X) {
                        # Y is a vector of binary responses
                        # X is a design matrix, you don't have to add a vector of 1's 
                        #   for the intercept

                        X    <- cbind(1, X)  # this adds the intercept for you
                        fit  <- glm.fit(X,Y, family = binomial(link = logit))
                        beta <- coef(fit)
                        fs   <- summary.glm(fit)
                        M    <- t(chol(fs$cov.unscaled))

                        return(list(betas=beta, uncertainties=M))
}

simulateY <- function(X, betas, uncertainties, ncolM, N){

             # X      <- cbind(1, X)  # it will be slightly faster if you input w/ 1's
             # ncolM  <- ncol(uncertainties) # faster if you input this
             betastar <- betas + uncertainties %*% rnorm(ncolM)
             p        <- 1/(1 + exp(-(X %*% betastar)))

             return(rbinom(N, size=1, prob=p))
}

4
+1. 나에게 이상한 부분은 피팅과 ​​시뮬레이션 예측이 모두 단일 함수의 본문 내에서 수행된다는 것입니다. 일반적으로 이와 같은 작업은 먼저 맞춤을 계산하고 (복귀 betaM) 이 맞춤을 기반으로 수많은 iid 시뮬레이션 을 생성 하여 수행됩니다 . 이러한 시뮬레이션에서, 하나 (회수 수 (피팅 크게 계산을 늦추고.마다 반복되도록 불필요한 것과 같은 기능에 모으기) 특히 응답의 비선형 또는 매우 복잡한 조합) 예측 구간.
whuber

@ whuber, 동의합니다. 실제로 함수를 시뮬레이션에 사용하기 전에 두 가지 함수로 나눌 것을 제안하려고 생각했지만 문제의 일부는 아닌 것 같습니다.
gung-Monica Monica 복원
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.