Como calcular o valor p de um odds ratio em R?

8

Eu tenho a seguinte tabela de valores:

25  75
38  162

A razão de chances é 0,7037 e log (OR) é -0,3514. Para uma tabela de contingência com os valores a, b, c e d, a variação do log (OR) é dada por

(1/a + 1/b + 1/c + 1/d)

Como posso calcular o valor p do log (OR) desses dados em R (se é significativamente diferente de 0)?

rnso
fonte

Respostas:

9

Você pode usar o teste exato de Fisher, que insere uma tabela de contingência e gera um valor p, com uma hipótese nula de que o odds ratio é 1 e uma hipótese alternativa de que o odds ratio não é igual a 1.

(tab <- matrix(c(38, 25, 162, 75), nrow=2))
#      [,1] [,2]
# [1,]   38  162
# [2,]   25   75
fisher.test(tab)
# 
#   Fisher's Exact Test for Count Data
# 
# data:  tab
# p-value = 0.2329
# alternative hypothesis: true odds ratio is not equal to 1
# 95 percent confidence interval:
#  0.3827433 1.3116294
# sample estimates:
# odds ratio 
#  0.7045301 

Nesse caso, o valor de p é 0,23.

josliber
fonte
Obrigado por uma maneira inteligente de determinar o valor de p. O teste do qui-quadrado também pode ser usado de maneira semelhante.
rnso
@ rnso, com certeza, embora o teste exato de Fisher seja preferido sobre o qui-quadrado quando você tiver pequenos tamanhos de célula em sua tabela de contingência.
josliber
4
Este é um mito de longa data, mas infelizmente não é verdade. O normal Pearson fornece valores mais precisos que o chamado teste "exato" de Fisher, mesmo quando as frequências esperadas são tão baixas quanto 1,0. Pχ2P
Frank Harrell
você poderia falar um pouco mais sobre esse @FrankHarrell? Eu sei que seria um resultado assintótico, enquanto o teste exato de Fisher se baseia na distribuição exata, como o valor de é mais "preciso" usando o método assintótico? pχ2p
Bdonovic 15/06/2015
1
Veja comentários extensos sobre isso no site. Resumidamente, os valores de P do teste de Fisher são muito grandes. O erro médio absoluto nos valores de P do teste de Pearson é menor. Fisher é apenas "exato" no sentido de que os valores de P são "garantidos" para não serem muito pequenos.
Frank Harrell
9

Outra maneira de fazer isso (além do teste exato de Fisher) é colocar os valores em um GLM binomial:

d <- data.frame(g=factor(1:2),
                s=c(25,75),
                f=c(38,162))
g <- glm(s/(s+f)~g,weights=s+f,data=d,
    family="binomial")
coef(summary(g))["g2",c("Estimate","Pr(>|z|)")]
##   Estimate   Pr(>|z|) 
## -0.3513979  0.2303337 

Para obter o teste da razão de verossimilhança (um pouco mais preciso que o valor Wald mostrado acima), façap

anova(g,test="Chisq")

que dá

##      Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL                     1     1.4178         
## g     1   1.4178         0     0.0000   0.2338

(LRT Wald Fisher neste caso, porque a amostra é bastante grande)p = 0,2303337 p = 0,2329p=0.2338p=0.2303337p=0.2329

Ben Bolker
fonte
4

χ2Prms

f <- lrm(y ~ groups, weights=freqs)
f  # prints LR chi-sq, d.f., P, many other quantities

Aqui, os modelos aninhados são esse modelo e um modelo somente de interceptação.

Frank Harrell
fonte
Eu pude achar que o teste LR (lrtest) é usado para comparar modelos aninhados. Como podemos usá-lo aqui? Você poderia escrever uma linha de código R para isso?
rnso
pelo que vale a pena, é mais ou menos a mesma abordagem estatística (embora com uma explicação melhor) da minha resposta acima. lrm()tem diferentes padrões, formatos de saída, etc., mas o modelo estatístico (IIUC) é o mesmo queglm(...,family="binomial")
Ben Bolker