Como R calcula o valor p para esta regressão binomial?

8

Considere a seguinte regressão binomial:

# Create some data
set.seed(10)
n <- 500
x <- runif(n,0,100)
y <- x + rnorm(n,sd=100) < 0
 
# Fit a binomial regression model
model <- glm(y ~ x, family="binomial")

summary(model)

A summaryfunção retorna um valor-p de 1.03e-05. Ao usar anova.glm, obtém-se valores-p ligeiramente mais extremos, independentemente do método usado para calcular o valor-p.

anova(model, test="Rao")   # p.value = 7.5e-6
anova(model, test="LRT")   # p.value = 6.3e-6
anova(model, test="Chisq") # p.value = 6.3e-6

O valor-p da summaryfunção se aplica à mesma hipótese que os retornados pela anovafunção? Se sim, como summarycalculou esse valor-p e é possível executar o mesmo cálculo diretamente anova?

Remi.b
fonte
3
Apesar da função R usar "binomial" como argumento para a família, a família binomial padrão assume o link de logit e você está conduzindo uma regressão logística.
AdamO 27/09/16

Respostas:

5

Pode ajudar você a ler minha resposta aqui: Por que meus valores p diferem entre a saída da regressão logística, o teste qui-quadrado e o intervalo de confiança para a sala de cirurgia? Sua pergunta aqui é quase uma duplicata, mas há alguns elementos adicionais na sua pergunta que podem ser abordados.

summary.glm()t0 0t

Usar anova.glm()permite acessar diferentes testes. Quando você define test="Rao", ele fornece o valor p de um teste de pontuação. E quando você define um test="Chisq"ou test="LRT"(eles são iguais), fornece o valor p de um teste de razão de verossimilhança.

A anova.glm()função testa a mesma hipótese nula que o teste Wald na summary()saída nesse caso . Isso ocorre apenas porque seu modelo possui apenas uma variável. A anova.glm()função executará testes sequenciais, que são análogos ao 'tipo I SS' em uma configuração linear, enquanto os testes de Wald de summary()são análogos ao 'tipo III SS' em uma configuração linear (veja minha resposta aqui: Como interpretar o tipo I, tipo II e tipo III ANOVA e MANOVA? ). Considerar:

x2 = rnorm(n)
m2 = glm(y~x+x2, family="binomial")
summary(m2)$coefficients
#                Estimate  Std. Error    z value     Pr(>|z|)
# (Intercept) -0.05906436 0.186876339 -0.3160612 7.519561e-01
# x           -0.01567551 0.003537183 -4.4316372 9.352029e-06
# x2          -0.05967796 0.099093504 -0.6022388 5.470152e-01
anova(m2, test="LRT")
# Terms added sequentially (first to last)
# 
#      Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
# NULL                   499     619.10              
# x     1  20.3841       498     598.72 6.335e-06 ***
# x2    1   0.3627       497     598.35     0.547    
m3 = glm(y~x2+x, family="binomial")  # I just switched the order of x & x2 here
summary(m3)$coefficients
#                Estimate  Std. Error    z value     Pr(>|z|)
# (Intercept) -0.05906436 0.186876339 -0.3160612 7.519561e-01
# x2          -0.05967796 0.099093504 -0.6022388 5.470152e-01  # these are the same
# x           -0.01567551 0.003537183 -4.4316372 9.352029e-06  #  as above
anova(m3, test="LRT")
# Terms added sequentially (first to last)
# 
#      Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
# NULL                   499     619.10              
# x2    1   0.1585       498     618.94    0.6906      # these differ from the
# x     1  20.5883       497     598.35 5.694e-06 ***  #  anova output above

Você pode usar a anova.glm()função para fornecer testes de razão de pontuação e de probabilidade de variáveis ​​individuais em um modelo de regressão logística múltipla que são análogos ao 'SS tipo III', mas é tedioso. Você precisaria continuar reajustando seu modelo para que cada variável, por sua vez, seja listada por último na fórmula fornecida para a glm()chamada. O último valor p listado na anova.glm()saída é aquele que será análogo ao 'tipo III SS'.

Para obter os testes de pontuação ou razão de verossimilhança de variáveis ​​individuais de forma mais conveniente, use em seu drop1()lugar. Considerar:

drop1(m3, test="LRT")
# Single term deletions
# 
# Model:
# y ~ x2 + x
#        Df Deviance    AIC     LRT  Pr(>Chi)    
# <none>      598.35 604.35                      
# x2      1   598.72 602.72  0.3627     0.547      # the same as when x2 is last above
# x       1   618.94 622.94 20.5883 5.694e-06 ***  # the same as when x  is last above
- Reinstate Monica
fonte
6

Em R, a summaryfunção para glmcalcula o valor-p usando uma estatística simples de Wald, ou seja,

2×Φ(-|β^|SE(β^))

β^SE(β^)Φ

Para recriar isso a partir da sua saída, tente

 beta = coef(model)[2]
 # getting estimate
 B_SE = sqrt(vcov(model)[2,2])
 # extracting standard error
 pvalue =  pnorm(-abs(beta) / B_SE)  * 2
 # pvalue = 1.027859e-05
Cliff AB
fonte