5 votos

Comprobar la significación de las categorías individuales en una tabla de contingencia

He preguntado a la gente qué comida prefiere:

     choice
group apple orange pizza beer
    A   374     63   216  101
    B   510     65   125   76

Al parecer, el grupo B prefiere la fruta y el grupo A prefiere la pizza y la cerveza, y una prueba de chi-cuadrado muestra que las diferencias globales entre los grupos son significativas. Pero, ¿cómo puedo comprobar para qué elección individual hay una diferencia significativa entre los grupos?

Por ejemplo, quiero saber si hay una diferencia significativa en la preferencia por las naranjas. Pero creo que no puedo limitarme a subconjuntar las elecciones de naranjas, porque así no tendría en cuenta el número total de participantes por grupo. Es decir, una diferencia entre 1 de A y 2 de B será significativa si sólo he muestreado a tres personas, pero no si son tres entre un millón.

Se pidió a los participantes que eligieran uno de los cuatro alimentos. No podían seleccionar varias respuestas.

¿Cómo puedo comprobarlo?


Mi idea sería sumar las respuestas que no son de color naranja y probar la tabla 2×2 resultante con una prueba de chi-cuadrado:

     choice
group orange not orange
    A     63        691
    B     65        711

orange <- matrix(c(63, 691, 65, 711), 2, 2, TRUE,
                 list(group = c("A", "B"), choice = c("orange", "not orange"))
                )

chisq.test(orange, correct = FALSE)
# p = .9883

o para calcular el porcentaje de respuestas naranjas en cada grupo, considere los dos números como recuentos en una distribución binomial y compruébelo con una prueba binomial:

a <- 63 / (63 + 691)
b <- 65 / (65 + 711)
all <- 63 + 691 + 65 + 711

binom.test(c(round(a * all / (a + b)), round(b * all / (a + b))))
# p = .9796

# just checkin'
all == sum(c(round(a * all / (a + b)), round(b * all / (a + b))))
[1] TRUE

¿O hay una forma mejor, tal vez más común?


Datos de la muestra

food <- c("apple", "orange", "pizza", "beer")
dat <- data.frame(
                  group  = rep(c("A", "B"), c(754, 776)),
                  choice = c(
                             rep(food, c(374, 63, 216, 101)),
                             rep(food, c(510, 65, 125, 76))
                            )
                 )
tab <- table(dat)

Explicación del segundo procedimiento

Queremos comparar las respuestas naranjas entre los grupos. Pero si sólo nos fijamos en las respuestas naranjas propiamente dichas, no tenemos en cuenta el hecho de que podrían darse otras respuestas. Así que en lugar de comparar el número absoluto de respuestas naranjas, lo que hacemos es ponderar el número absoluto de respuestas naranjas por su proporción dentro de todas las respuestas de cada grupo. O, en otras palabras, comprobamos si existe una diferencia significativa entre las porcentajes de respuestas naranjas en ambos grupos.

Dada esta tabla de contingencia:

     choice
group orange not orange
    A     63        691
    B     65        711

para el grupo A, el porcentaje de respuestas naranjas es:

a <- 63 / (63 + 691)  # 0.08355438 * 100 = 8.36%

y para el grupo B es:

b <- 65 / (65 + 711)  # 0.08376289 * 100 = 8.38%

Ya podemos decir que la diferencia de porcentajes es mínima, pero esto es sólo un ejemplo, así que continuemos.

Para comparar los porcentajes, vamos a considerarlos como dos categorías (A y B) en una distribución binomial. Para una prueba binomial, necesitamos un vector de la misma longitud que el número total de respuestas. El número global de respuestas en mi estudio es:

all <- 63 + 691 + 65 + 711

Para calcular la proporción de la distribución binomial que corresponde a los porcentajes de respuestas naranjas en cada grupo, simplemente "escalamos" (es decir, multiplicamos por el mismo factor) ambos porcentajes para que sumen el 100% (de todas las observaciones); es decir, resolvemos el cálculo:

a * x + b * x = all

La resolución, por supuesto es:

x = all / (a + b)

Ahora podemos calcular el número de observaciones de cada categoría:

# for A:
a * all / (a + b)

# for B:
b * all / (a + b)

Por último, redondeamos los posibles números fraccionarios a enteros y realizamos la prueba binomial:

binom.test(c(round(a * all / (a + b)), round(b * all / (a + b))))

que devuelve:

number of successes = 764, number of trials = 1530, p-value = 0.9796
alternative hypothesis: true probability of success is not equal to 0.5
95 percent confidence interval:
 0.4739876 0.5247077
sample estimates:
probability of success 
             0.4993464

1voto

user164061 Puntos 281

Su segundo procedimiento con la prueba binomial no tiene sentido. Estás calculando la probabilidad de obtener 764 frente a 766 caras y colas para una moneda justa. Lo que se relaciona con algún escalamiento para comparar los grupos A y B como si hubiera un total de 1530 naranjas (en lugar de 128) y la probabilidad para cada grupo A o B es de 0,5


Se podría aplicar la prueba binomial/multinomial en lugar de la prueba Chi-Cuadrado, pero implica una molesta integración para obtener la distribución de $\chi$ la suma de los cuadrados de los términos de error.

La prueba de Chi-cuadrado suele resolver esta molesta integración utilizando la distribución gaussiana como aproximación a la distribución de las variables medidas. Esto permite utilizar una transformación a coordenadas esféricas y una única integral para obtener el resultado (ya que la distribución de probabilidad gaussiana multivariante tiene forma elíptica/esférica y $\chi$ es la única variable en coordenadas esféricas para la que varía la probabilidad).

Si no expresa $\chi$ como aproximación de los términos de error con distribución gaussiana, entonces habría que integrar sobre todas las diferentes dimensiones. Así que digamos que usted tiene su tabla matrix(c(63, 691, 65, 711), 2, 2) entonces se podría calcular la diferencia observada menos la esperada y utilizar el multinomial para calcular la probabilidad del tamaño de esta diferencia, integrando sobre las probabilidades de cada posible observación con menor $\chi$ dado el valor esperado.

Este cálculo sólo tiene sentido si los números son pequeños y la aproximación por una distribución gaussiana está creando grandes discrepancias.

Ejemplo:

#matrix for the beer case 
#(since uncorrected chi^2 is zero for the orange and not interesting to model)
A = matrix(c(101, 374+63+216, 76, 510+65+125), 2, 2,TRUE) 

#A = t(A)

#modeling expected values
pt <- (A[1,1] + A[2,1]) / sum(A)
E <- c(A[1,1]+A[1,2] , A[2,1]+A[2,2]) * pt

r1 <- A[1,1]+A[1,2]
r2 <- A[2,1]+A[2,2]

#calculating chi^2
D <- E - A[,1]
chi2 <- sum(D^2/E)+sum(D^2/(c(r1,r2)-E))

#initialization of integration variable
pchi <- 0

# assuming two binomial distribution with equal p=pt based on observed data
# integrating over the possible observed values for which chi^2 is lower than observed chi^2
#calculate probability for particular set i,j and add to the integration 
for (i in 2:(r1-1)) {
  for (j in 2:(r2-1)) {
    pt2 <- (i+j)/(r1+r2)
    chi22 <- (i-pt2*r1)^2/(pt2*r1) +
      (r1-i-(1-pt2)*r1)^2/((1-pt2)*r1) +
      (j-pt2*r2)^2/(pt2*r2) +
      (r2-j-(1-pt2)*r2)^2/((1-pt2)*r2)
    if(chi22<chi2) { 
      pchi <- pchi + dbinom(i,r1,pt)*dbinom(j,r2,pt)
    }
  }
}

#p-value by multinomial
1 - pchi

#p-value by chi-square distribution
chisq.test(A, correct=0)[3]

Estos resultados son cercanos: 0,02742869 y 0,02767172

Notas sobre este ejemplo (véase la discusión en los comentarios):

  • El problema de los parámetros molestos se resuelve utilizando la estimación $\hat{p}$ . Esta es otra cuestión que la prueba de chi-cuadrado resuelve, ya que la aproximación por la distribución gaussiana no implica este parámetro.
  • Se asumió que los totales de las filas están fijados por el diseño experimental.

Lo anterior se refiere a su segundo procedimiento y a la $\chi^2$ -prueba en su primer procedimiento.

En cuanto a tu segunda pregunta (¿hay otros procedimientos?). Podría expresar estimaciones para el valor y la varianza/error, o intervalos de confianza, de los coeficientes en la distribución multinomial y utilizar estas estimaciones para expresar sus ideas sobre las variaciones entre los dos grupos para categorías individuales específicas. (vea más aquí: Intervalo de confianza y tamaño de la muestra probabilidades multinomiales )

Creo que este enfoque, utilizando los intervalos de confianza, sería mejor (proporcionaría una mejor idea de la situación) que el simple cálculo de los valores p.

(El valor p es más bien un combinado La estadística que equilibra la diferencia entre los grupos y el error en las estimaciones, y sólo da una idea sobre el equilibrio pero no sobre los dos por separado. Imagine los siguientes experimentos mentales: 1) podría obtener un valor p alto y una diferencia significativa para su categoría de naranja si tiene un tamaño de muestra suficientemente grande, incluso con la pequeña diferencia de 8,36% frente a 8,38%, y también 2) podría tener una diferencia no significativa para su categoría de pizza, incluso con una diferencia de factor 2, si su tamaño de muestra es demasiado pequeño).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X