python r scipy

Test Chi-Cuadrado en Python



scipy (3)

Solo quería señalar que, si bien la respuesta parece ser sintácticamente correcta, no debe usar una distribución de Chi cuadrado con su ejemplo porque ha observado frecuencias que son demasiado pequeñas para una prueba de Chi cuadrado precisa.

"Esta prueba no es válida cuando las frecuencias observadas o esperadas en cada categoría son demasiado pequeñas. Una regla típica es que todas las frecuencias observadas y esperadas deben ser al menos 5". consulte: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chisquare.html#scipy.stats.chisquare

He usado el siguiente código en R para determinar cómo los valores observados (20, 20, 0 y 0, por ejemplo) se ajustan a los valores / relaciones esperados (25% para cada uno de los cuatro casos, por ejemplo):

> chisq.test(c(20,20,0,0), p=c(0.25, 0.25, 0.25, 0.25)) Chi-squared test for given probabilities data: c(20, 20, 0, 0) X-squared = 40, df = 3, p-value = 1.066e-08

¿Cómo puedo replicar esto en Python? He intentado usar la función chisquare de scipy pero los resultados que obtuve fueron muy diferentes; No estoy seguro de si esta es la función correcta para usar. He buscado a través de la documentación de scipy , pero es bastante desalentador ya que se ejecuta a más de 1000 páginas; La documentación numpy es casi un 50% más que eso.


Una alternativa sería llamar a su código R desde python. Puedes hacerlo:

  • haciendo que un script R se ejecute como una herramienta de línea de comandos. Vea este enlace para obtener más información sobre la ejecución de scripts R desde la línea de comandos utilizando Rscript . Desde python, puede ejecutar un script R ejecutando una llamada al sistema utilizando subprocess o os.system . Cualquier intercambio de datos se realiza a través de texto o archivos binarios. Me gusta este enfoque porque es muy simple y es fácil depurar la secuencia de comandos R por separado del código de Python. El inconveniente es que todos los datos pasan por el disco duro, lo que podría resultar muy lento.
  • usando rpy , o rpy2 para ejecutar el código R directamente desde Python. De esta manera, la integración es más estrecha, pero este enlace también presenta sus propias peculiaridades. Por ejemplo, en mi experiencia, depurar el código R llamado a través de rpy es un poco más difícil de depurar.

scipy.stats.chisquare espera frecuencias absolutas observadas y esperadas, no ratios. Puedes obtener lo que quieras con

>>> observed = np.array([20., 20., 0., 0.]) >>> expected = np.array([.25, .25, .25, .25]) * np.sum(observed) >>> chisquare(observed, expected) (40.0, 1.065509033425585e-08)

Aunque en el caso de que los valores esperados se distribuyan uniformemente entre las clases, puede omitir el cálculo de los valores esperados:

>>> chisquare(observed) (40.0, 1.065509033425585e-08)

El primer valor devuelto es el estadístico χ², el segundo es el valor p de la prueba.