Перевірка припущення пропорційних шансів проводиться в порядковій логістичній регресії за допомогою функції polr


9

Я використав функцію 'polr' в пакеті MASS, щоб запустити порядкову логістичну регресію для порядкової категоріальної змінної відповіді з 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))

Перевірка припущення. Таким чином, наступний код буде оцінювати значення, які слід сприймати. По-перше, він показує нам перетворення logit ймовірностей бути більшим або рівним кожному значенням цільової змінної

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 ). Я намагався запускати ті самі моделі, але постійно зустрічаюся з попередженнями та помилками.

Наприклад, коли я намагаюся встановити модель vglm з аргументом "паралельний = FALSE" (оскільки згадується попереднє посилання для тестування припущення про пропорційні шанси), я стикаюся з такою помилкою:

Помилка lm.fit (X.vlm, y = z.vlm, ...): NA / NaN / Inf в 'y'
Крім того: Попереджувальне повідомлення:
In Deviance.categorical.data.vgam (mu = mu, y = y, w = w, залишки = залишки,: встановлені значення, близькі до 0 або 1

Я хотів би запитати, будь ласка, чи є хтось, хто може зрозуміти і зможе пояснити мені, чому графік, який я створив вище, виглядає так, як це робиться. Якщо насправді це означає, що щось не так, ви можете, будь ласка, допомогти мені знайти спосіб перевірити припущення про пропорційні шанси при використанні функції polr. Або якщо це просто неможливо, тоді я вдадуся до спроби використовувати функцію vglm, але тоді мені знадобиться допомога, щоб пояснити, чому я продовжую отримувати вказану вище помилку.

ПРИМІТКА. Як фон, тут є 1000 точок даних, які фактично є точками розташування в досліджуваній області. Я дивлюсь, чи є зв’язки між категоричною змінною відповіді та цими 15 пояснювальними змінними. Всі ці 15 пояснювальних змінних є просторовими характеристиками (наприклад, висота, координати xy, близькість до лісу тощо). 1000 точок даних були розподілені випадковим чином за допомогою ГІС, але я застосував стратифікований підбір вибірки. Я переконався, що 125 балів були вибрані випадковим чином у межах кожного з 8 різних рівнів категоричної відповіді. Я сподіваюся, що ця інформація також корисна.

Відповіді:


1

Залежна змінна має 8 упорядкованих рівнів, тому у графіку для перевірки припущення про пропорційні шанси ви повинні побачити 8 різних символів для кожної незалежної змінної. Ви бачите лише 2 символи для кожної незалежної змінної, ймовірно, тому, що ви вибрали занадто короткий інтервал для значень осі x. Якщо моя гіпотеза є правильною, просто потрібно використовувати більш широкий інтервал для значень осі 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 - Відновіть Моніку

Я тільки вдосконалив свою відповідь. Скажіть, будь ласка, чи задовольняє це
Джон М

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. Використовуючи приклад з стратегії моделювання регресії Гаррела:

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)

введіть тут опис зображення проти

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.