Використання glm () в якості заміни для простого тесту на квадрат чі


15

Мені цікаво змінити нульові гіпотези за допомогою glm() Р.

Наприклад:

x = rbinom(100, 1, .7)  
summary(glm(x ~ 1, family = "binomial"))

перевіряє гіпотезу, що p=0.5 . Що робити, якщо я хочу змінити нуль на p = якесь довільне значення, усередині glm()?

Я знаю , що це може бути зроблено також з prop.test()і chisq.test(), але я хотів би вивчити ідею використання glm()для перевірки всіх гіпотез , що відносяться до категоріальним даними.


7
+1. очевидно посилається на біноміальний параметр, виражений як ймовірність. Оскільки природним посиланням (і тим, що використовується за замовчуванням) є logit, щоб уникнути плутанини, важливо відрізнити p від його logit, що є журналом шансів журналу ( p / ( 1 - p ) ) . pglmplog(p/(1p))
whuber

Відповіді:


19

Можна використовувати зміщення : glmз family="binomial"параметрами оцінки за шкалою log-odds або logit, тому відповідає log-коефіцієнтам 0 або ймовірності 0,5. Якщо ви хочете порівняти з ймовірністю р , ви бажаєте, щоб базовим значенням було q = logit ( p ) = log ( p / ( 1 - p ) ) . Зараз є статистична модельβ0=0pq=logit(p)=log(p/(1p))

YBinom(μ)μ=1/(1+exp(η))η=β0+q

де змінився лише останній рядок від стандартного налаштування. У коді R:

  • використання offset(q)у формулі
  • функція logit / log-odds є qlogis(p)
  • злегка роздратовано, ви повинні надати значення зміщення для кожного елемента в змінній відповіді - R не буде автоматично повторювати постійне значення для вас. Це робиться нижче, встановивши кадр даних, але ви могли просто скористатися rep(q,100).
x = rbinom(100, 1, .7)
dd <- data.frame(x, q = qlogis(0.7)) 
summary(glm(x ~ 1 + offset(q), data=dd, family = "binomial"))

2
(+1) це дасть вам тест Wald. LRT можна зробити підгонку нульової моделі glm(y ~ offset(q)-1, family=binomial, data=dd)та використання lrtestз lmtestпакету. Хір-квадрат Пірсона є тестовим балом для моделі GLM. Wald / LRT / Score - всі послідовні тести і повинні забезпечувати еквівалентний висновок при досить великих розмірах вибірки.
AdamO

1
Я думаю, ви також можете використовувати anova()з бази R на glm, щоб отримати тест на LR
Бен Болкер

Цікаво, що я втратив звичку користуватися ANOVA. Однак я зауважую, що Anova відмовляється друкувати pvalue для тесту, тоді як lrtest.
AdamO

2
можливо anova(.,test="Chisq")?
Бен Болкер

6

Подивіться на довірчий інтервал для параметрів вашого GLM:

> set.seed(1)
> x = rbinom(100, 1, .7)
> model<-glm(x ~ 1, family = "binomial")
> confint(model)
Waiting for profiling to be done...
    2.5 %    97.5 % 
0.3426412 1.1862042 

Це довірчий інтервал для коефіцієнтів журналу.

Для маємо log ( o d d s ) = log pp=0.5log(odds)=logp1p=log1=0p=0.5

p


1
p<0.05

2
confintp<0,05

2

Не (цілком) коректно / точно використовувати р-значення, засновані на z- / t-значеннях у функції glm.summary як тест гіпотези.

  1. Це заплутана мова. Повідомлені значення називаються z-значеннями. Але в цьому випадку вони використовують оцінену стандартну помилку замість справжнього відхилення. Тому насправді вони ближче до t-значень . Порівняйте наступні три виходи:
    1) Summary.glm
    2) t-test
    3) z-test

    > set.seed(1)
    > x = rbinom(100, 1, .7)
    
    > coef1 <- summary(glm(x ~ 1, offset=rep(qlogis(0.7),length(x)), family = "binomial"))$coefficients
    > coef2 <- summary(glm(x ~ 1, family = "binomial"))$coefficients
    
    > coef1[4]  # output from summary.glm
    [1] 0.6626359
    > 2*pt(-abs((qlogis(0.7)-coef2[1])/coef2[2]),99,ncp=0) # manual t-test
    [1] 0.6635858
    > 2*pnorm(-abs((qlogis(0.7)-coef2[1])/coef2[2]),0,1) # manual z-test
    [1] 0.6626359
  2. Вони не є точними p-значеннями. Точне обчислення р-значення за допомогою біноміального розподілу працювало б краще (з обчислювальною потужністю в наш час це не проблема). Розподіл t, припускаючи гауссовий розподіл помилки, не є точним (він завищує p, перевищення рівня альфа зустрічається рідше в "реальності"). Дивіться таке порівняння:

    # trying all 100 possible outcomes if the true value is p=0.7
    px <- dbinom(0:100,100,0.7)
    p_model = rep(0,101)
    for (i in 0:100) {
      xi = c(rep(1,i),rep(0,100-i))
      model = glm(xi ~ 1, offset=rep(qlogis(0.7),100), family="binomial")
      p_model[i+1] = 1-summary(model)$coefficients[4]
    }
    
    
    # plotting cumulative distribution of outcomes
    outcomes <- p_model[order(p_model)]
    cdf <- cumsum(px[order(p_model)])
    plot(1-outcomes,1-cdf, 
         ylab="cumulative probability", 
         xlab= "calculated glm p-value",
         xlim=c(10^-4,1),ylim=c(10^-4,1),col=2,cex=0.5,log="xy")
    lines(c(0.00001,1),c(0.00001,1))
    for (i in 1:100) {
      lines(1-c(outcomes[i],outcomes[i+1]),1-c(cdf[i+1],cdf[i+1]),col=2)
    #  lines(1-c(outcomes[i],outcomes[i]),1-c(cdf[i],cdf[i+1]),col=2)
    }
    
    title("probability for rejection as function of set alpha level")

    CDF відхилення альфа

    Чорна крива являє собою рівність. Червона крива знаходиться нижче неї. Це означає, що для заданого обчисленого p-значення за підсумковою функцією glm ми виявляємо цю ситуацію (або більшу різницю) в реальності рідше, ніж вказує значення p.


Хм .. Мене може бентежити обґрунтування використання розподілу Т для ГЛМ. Чи можете ви досягти піку в спорідненому питанні, яке я щойно задав тут ?
AdamO

2
Ця відповідь цікава, але проблемна. (1) ОП насправді не запитували про різницю між підрахунками, чи-квадратними, "точними" або підходами, заснованими на GLM, для тестування гіпотез щодо біноміальних відповідей (вони насправді можуть знати все це), тож це не означає " t відповісти на поставлене запитання; (2) оцінки залишкової дисперсії тощо мають різний набір припущень та розподілу вибірки з лінійних моделей (як у запитанні @ AdamO), тому використання t-тесту є дискусійним; ...
Бен Болкер

2
(3) "точні" довірчі інтервали для біноміальних відповідей насправді складні ("точні" інтервали [Клопер-Вілсон] консервативні; тестові показники можуть працювати краще в деяких діапазонах
Бен Болкер,

@Ben Ви праві, що z-test si насправді кращий, ніж t-test. Графік, відображений у відповіді, призначений для z-тесту. Він використовує вихід функції GLM. Підсумком моєї відповіді було те, що "p-значення" - справа хитра. Тому я вважаю, що краще обчислити це явно, наприклад, використовуючи звичайний розподіл, а не витягуючи значення p з функції glm, яка дуже зручно зміщується зі зміщенням, але приховує початок обчислень для p-значення .
Секст Емпірік

1
@BenBolker, я вважаю, що точний тест справді консервативний, але ... лише тому, що насправді ми не відбираємо вибірку з ідеальних біноміальних розподілів. Альтернативний z-тест є кращим лише з емпіричної точки зору. Це те, що дві "помилки" скасовують один одного 1) біноміальний розподіл не є реальним розподілом залишків у практичних ситуаціях; 2) z-розподіл не є точним виразом для біноміального розподілу. Сумнівно, чи слід віддавати перевагу неправильному розподілу для неправильної моделі, лише тому, що на практиці це виявляється «нормально».
Секст Емпірік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.