비례 확률 가정 확인은 polr 함수를 사용하여 순서 형 로지스틱 회귀 분석에서 유지됨


9

MASS 패키지의 'polr'함수를 사용하여 15 개의 연속 설명 변수가있는 순서 형 범주 형 반응 변수에 대해 순서 형 로지스틱 회귀 분석을 실행했습니다.

코드를 사용하여 (아래 그림 참조) 내 모델이 UCLA 안내서에 제공된 조언에 따라 비례 승산 가정을 충족하는지 확인했습니다 . 그러나 다양한 컷 포인트의 계수가 비슷할뿐만 아니라 정확히 동일하다는 것을 암시하는 출력에 대해 약간 걱정하고 있습니다 (아래 그림 참조).

FGV1b <- data.frame(FG1_val_cat=factor(FGV1b[,"FG1_val_cat"]), 
                    scale(FGV1[,c("X","Y","Slope","Ele","Aspect","Prox_to_for_FG", 
                          "Prox_to_for_mL", "Prox_to_nat_border", "Prox_to_village", 
                          "Prox_to_roads", "Prox_to_rivers", "Prox_to_waterFG", 
                          "Prox_to_watermL", "Prox_to_core", "Prox_to_NR", "PCA1", 
                          "PCA2", "PCA3")]))
b     <- polr(FG1_val_cat ~ X + Y + Slope + Ele + Aspect + Prox_to_for_FG + 
                            Prox_to_for_mL + Prox_to_nat_border + Prox_to_village + 
                            Prox_to_roads + Prox_to_rivers + Prox_to_waterFG + 
                            Prox_to_watermL + Prox_to_core + Prox_to_NR, 
              data=FGV1b, Hess=TRUE)

모델 요약을 봅니다.

summary(b)
(ctableb <- coef(summary(b)))
q        <- pnorm(abs(ctableb[, "t value"]), lower.tail=FALSE) * 2
(ctableb <- cbind(ctableb, "p value"=q))

이제 모수 추정치의 신뢰 구간을 볼 수 있습니다.

(cib <- confint(b)) 
confint.default(b)

그러나이 결과는 여전히 해석하기가 어렵 기 때문에 계수를 승산 비로 변환하겠습니다

exp(cbind(OR=coef(b), cib))

가정 확인. 따라서 다음 코드는 그래프로 표시 될 값을 추정합니다. 먼저 목표 변수의 각 값보다 크거나 같은 확률의 로짓 변환을 보여줍니다.

FG1_val_cat <- as.numeric(FG1_val_cat)
sf <- function(y) {
  c('VC>=1' = qlogis(mean(FG1_val_cat >= 1)),
    'VC>=2' = qlogis(mean(FG1_val_cat >= 2)),
    'VC>=3' = qlogis(mean(FG1_val_cat >= 3)),
    'VC>=4' = qlogis(mean(FG1_val_cat >= 4)),
    'VC>=5' = qlogis(mean(FG1_val_cat >= 5)),
    'VC>=6' = qlogis(mean(FG1_val_cat >= 6)),
    'VC>=7' = qlogis(mean(FG1_val_cat >= 7)),
    'VC>=8' = qlogis(mean(FG1_val_cat >= 8)))
}
(t <- with(FGV1b, summary(as.numeric(FG1_val_cat) ~ X + Y + Slope + Ele + Aspect + 
                             Prox_to_for_FG + Prox_to_for_mL + Prox_to_nat_border + 
                             Prox_to_village + Prox_to_roads + Prox_to_rivers + 
                             Prox_to_waterFG + Prox_to_watermL + Prox_to_core + 
                             Prox_to_NR, fun=sf)))

위의 표에는 평행 기울기 가정없이 예측 변수에 대한 종속 변수를 한 번에 하나씩 회귀 분석 할 때 얻을 수있는 (선형) 예측 값이 표시됩니다. 이제 종속 변수에 대한 다양한 컷 포인트로 일련의 이항 로지스틱 회귀 분석을 실행하여 컷 포인트에서 계수의 동등성을 확인할 수 있습니다.

par(mfrow=c(1,1))
plot(t, which=1:8, pch=1:8, xlab='logit', main=' ', xlim=range(s[,7:8]))

polr 가정 점검

통계 전문가가 아니며 여기에 분명한 내용이 빠져있을 수 있습니다. 그러나 모델 가정을 테스트하는 방법에 문제가 있는지 확인하고 동일한 종류의 모델을 실행하는 다른 방법을 알아 내려고 오랜 시간을 보냈습니다.

예를 들어, 많은 도움말 메일 링리스트에서 다른 사람들이 vglm 함수 (VGAM 패키지)와 lrm 함수 (rms 패키지)를 사용한다는 것을 읽었습니다 (예 : 패키지와 함께 R에서 순서 로지스틱 회귀 분석의 비례 배당 가정) VGAM 및 rms ). 동일한 모델을 실행하려고했지만 경고 및 오류가 계속 발생합니다.

예를 들어, 'parallel = FALSE'인수로 vglm 모델을 맞추려고 할 때 (이전 링크 언급은 비례 승산 가정 테스트에 중요하므로) 다음과 같은 오류가 발생합니다.

lm.fit (X.vlm, y = z.vlm, ...) 오류 : 'y'의 NA / NaN / Inf
추가 : 경고 메시지 :
Deviance.categorical.data.vgam (mu = mu, y = y, w = w, 잔차 = 잔차, : 0 또는 1에 가까운 적합치

위에서 생성 한 그래프가 왜 그렇게 보이는지 이해하고 설명 할 수있는 사람이 있는지 물어보고 싶습니다. 실제로 그것이 옳지 않다는 것을 의미한다면, polr 함수를 사용할 때 비례 확률 가정을 테스트하는 방법을 찾도록 도와 줄 수 있습니까? 또는 이것이 가능하지 않은 경우 vglm 함수를 사용하려고 시도하지만 위의 오류가 계속 발생하는 이유를 설명하는 데 도움이 필요합니다.

참고 : 배경으로 여기에는 실제로 연구 영역의 위치 지점 인 1000 개의 데이터 포인트가 있습니다. 범주 형 응답 변수와이 15 개의 설명 변수 사이에 관계가 있는지 확인하려고합니다. 이 15 개의 설명 변수는 모두 공간 특성입니다 (예 : 고도, xy 좌표, 산림에 대한 근접성 등). GIS를 사용하여 1000 개의 데이터 포인트를 무작위로 할당했지만 계층화 된 샘플링 방식을 취했습니다. 8 가지 범주 형 반응 수준 각각에서 125 점을 무작위로 선택했습니다. 이 정보가 도움이되기를 바랍니다.

답변:


1

종속 변수는 8 개의 순서 레벨을 가지므로 그래프에서 비례 배당 가정을 테스트하기 위해 모든 독립 변수에 대해 8 개의 다른 기호가 표시되어야합니다. x 축 값에 대해 너무 짧은 간격을 선택했기 때문에 모든 독립 변수에 대해 2 개의 기호 만 표시됩니다. 내 추측이 맞다면 x 축 값에 더 넓은 간격을 사용해야합니다. 이 코드를 사용해보십시오 :

par(mfrow=c(1,1))
plot(t, which=1:8, pch=1:8, xlab='logit', main=' ', xlim=range(s[,3:9]))

5
이것은 우리의 표준으로 대답하기에 충분하지 않습니다. 정교하게 할 수 있습니까? 이 코드는 어떤 역할을하고 PO 가정을 확인하는 방법은 무엇입니까? (예를 들어, 다른 소프트웨어를 사용하는 사람이 어떻게이 같은 접근 방식을 사용하겠습니까?)
gung-Reinstate Monica

방금 답변을 개선했습니다. 그것이 만족
John M

1

그래서 나는 인터넷 검색을 통해 이것을 발견했으며 그 이유에 대한 답이 여전히 유용 할 것이라고 생각합니다. 실수가 있다고 생각합니다

sf <- function(y) {
  c('VC>=1' = qlogis(mean(FG1_val_cat >= 1)),
    'VC>=2' = qlogis(mean(FG1_val_cat >= 2)),
    'VC>=3' = qlogis(mean(FG1_val_cat >= 3)),
    'VC>=4' = qlogis(mean(FG1_val_cat >= 4)),
    'VC>=5' = qlogis(mean(FG1_val_cat >= 5)),
    'VC>=6' = qlogis(mean(FG1_val_cat >= 6)),
    'VC>=7' = qlogis(mean(FG1_val_cat >= 7)),
    'VC>=8' = qlogis(mean(FG1_val_cat >= 8)))
}

FG1_val_cat대신에 사용하십시오 y. Harrell 's Regression Modeling Strategies의 예를 사용하여 :

library(Hmisc)
getHdata(support)
support <- support[complete.cases(support[, c("sfdm2", "adlsc", "sex", "age", "meanbp")]), ]
sfdm <- as.integer (support$sfdm2 ) - 1

sf1 <- function (y) {
  c(' Y ≥ 1 ' = qlogis (mean(sfdm >= 1)), 
    ' Y ≥ 2 ' = qlogis (mean(sfdm >= 2)),
    ' Y ≥ 3 ' = qlogis (mean(sfdm >= 3))
  )
}

sf2 <- function (y) {
  c(' Y ≥ 1 ' = qlogis (mean(y >= 1)), 
    ' Y ≥ 2 ' = qlogis (mean(y >= 2)),
    ' Y ≥ 3 ' = qlogis (mean(y >= 3))
  )
}

s1 <- summary(sfdm ~ adlsc + sex + age + meanbp, fun=sf1,
              data = support)
s2 <- summary(sfdm ~ adlsc + sex + age + meanbp, fun=sf2,
              data = support)  

plot(s1, which =1:3, pch =1:3, xlab = ' logit ', main = ' ', width.factor = 1.4, cex.lab = 0.75)

plot(s2, which =1:3, pch =1:3, xlab = ' logit ', main = ' ', width.factor = 1.4, cex.lab = 0.75)

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.