Chi-cuadrado + datos composicionales

Continuamos con el seguimiento de lo que aprendimos de ANOVA, que me ayuda a hacer comparaciones en variables numericas. Pero ¿que pasa cuando las variables son categoricas?

Por ejemplo

¿Fuma? → Sí / No ¿Enfermó? → Sí / No

No puedo calcular una media de “Sí” y “No”. Necesitamos otra herramienta, esto resulta practico si lo pensamos orientado a la agronomia, con la deficiencia de potasio o nitrogeno, con una tabla de informacion de si y no con la deficiencia dependiendo del color de las hojas.

Entonces el siguiente codigo va a tratarse sobre la deficiencia de las hojas que se estan midiendo de N-P-K por ejemplo en las hojas. La verdadera pregunta es cuántas plantas esperarías en cada celda si el suelo y la deficiencia fueran completamente independientes.

tabla_plantas <- matrix (
  c( 30, 10, 5,
     8, 25, 7,
     7, 10, 18),
    nrow = 3,
    byrow = TRUE,
    dimnames = list (
      Deficiencia = c("N", "P", "K"),
      Suelo = c("Ácido", "Neutro", "Alcalino")
    )
  )

tabla_plantas
##            Suelo
## Deficiencia Ácido Neutro Alcalino
##           N    30     10        5
##           P     8     25        7
##           K     7     10       18
chisq.test(tabla_plantas)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_plantas
## X-squared = 40.696, df = 4, p-value = 3.107e-08

El p-valor esta muy por debajo del valor 0.05 entonces rechazamos la hipotesis nula y tomamos la hipotesis alterna.

H₀ = el tipo de suelo y la deficiencia son INDEPENDIENTES H₁ = el tipo de suelo y la deficiencia están RELACIONADOS

H₀ = “no pasa nada” → independencia, igualdad, no efecto H₁ = “sí pasa algo” → dependencia, diferencia, efecto real

Con un p-valor de 3.107e-08 rechazamos H₀ y aceptamos H₁, concluyendo que el tipo de suelo y la deficiencia nutricional son dependientes entre sí. Es decir, el tipo de suelo acido, neutro o alcalino influye en qué nutriente le falta a la planta.

Recordemos entonces que pocos datos de prueba = pocos datos para distribuir en la celda y si hay un valor muy elevado se dañan los demás datos; En chi cuadrado es critico entonces voy a correr el siguiente codigo

chisq.test(tabla_plantas)$expected
##            Suelo
## Deficiencia  Ácido Neutro Alcalino
##           N 16.875 16.875    11.25
##           P 15.000 15.000    10.00
##           K 13.125 13.125     8.75

Chi cuadrado seguira siendo confiable en la medida de >5, cuando este por debajo de ese valor ya no se puede confiar en la fiabilidad de esta prueba.

Probemos un ejemplo con E = 1 Y O = 3

$ ^2 = {1}$

El resultado que vamos a obtener es

$ {1} = 4$

¿Ves lo que pasa? Con E muy pequeño, cualquier diferencia pequeña entre O y E se infla enormemente en el resultado final.

E < 5 en alguna celda → Chi-cuadrado inflado → resultado no confiable → usar prueba de Fisher exacta

Para la prueba de fisher el codigo que usaremos es el siguiente.

fisher.test(tabla_plantas)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  tabla_plantas
## p-value = 1.259e-07
## alternative hypothesis: two.sided

Como podemos evidenciar el p-valor esta muy por debajo del resultado 0.05 para rechazar la hipotesis nula entonces tomaremos tambien en el Fisher la hipotesis alterna.

(table_of_decision_making <- data.frame(
  situacion <- c("Todas las celdas esperadas ≥ 5", "Alguna celda esperada < 5", "Tabla 2×2 con pocos datos"),
  prueba_recomendada <- c("Chi-cuadrado","Fisher exacto","Fisher exacto")
))
##   situacion....c..Todas.las.celdas.esperadas...5....Alguna.celda.esperada...5...
## 1                                                 Todas las celdas esperadas ≥ 5
## 2                                                      Alguna celda esperada < 5
## 3                                                      Tabla 2×2 con pocos datos
##   prueba_recomendada....c..Chi.cuadrado....Fisher.exacto....Fisher.exacto..
## 1                                                              Chi-cuadrado
## 2                                                             Fisher exacto
## 3                                                             Fisher exacto
sessionInfo()
## R version 4.2.3 (2023-03-15)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur 11.7.11
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## loaded via a namespace (and not attached):
##  [1] digest_0.6.39     R6_2.6.1          lifecycle_1.0.5   jsonlite_2.0.0   
##  [5] evaluate_1.0.5    cachem_1.1.0      rlang_1.1.7       cli_3.6.5        
##  [9] rstudioapi_0.18.0 jquerylib_0.1.4   bslib_0.10.0      rmarkdown_2.30   
## [13] tools_4.2.3       xfun_0.56         yaml_2.3.12       fastmap_1.2.0    
## [17] compiler_4.2.3    htmltools_0.5.9   knitr_1.51        sass_0.4.10