vectores una tutorial transpuesta multiplicar matriz matrices imprimir funciones array python math numpy statistics scipy

python - tutorial - ¿Cómo determinar cuál es la función de distribución de probabilidad de una matriz numpy?



transpuesta de una matriz en python numpy (1)

He buscado alrededor y para mi sorpresa, parece que esta pregunta no ha sido respondida.

Tengo una matriz Numpy que contiene 10000 valores de mediciones. He trazado un histograma con Matplotlib, y por inspección visual los valores parecen estar distribuidos normalmente:

Sin embargo, me gustaría validar esto. He encontrado una prueba de normalidad implementada en scipy.stats.mstats.normaltest , pero el resultado dice lo contrario. Obtengo esta salida:

(masked_array(data = [1472.8855375088663], mask = [False], fill_value = 1e+20) , masked_array(data = [ 0.], mask = False, fill_value = 1e+20)

)

lo que significa que las posibilidades de que el conjunto de datos se distribuya normalmente son 0. He vuelto a ejecutar los experimentos y los he probado de nuevo obteniendo el mismo resultado, y en el "mejor" caso, el valor de p fue 3.0e-290.

He probado la función con el siguiente código y parece que hace lo que quiero:

import numpy import scipy.stats as stats mu, sigma = 0, 0.1 s = numpy.random.normal(mu, sigma, 10000) print stats.normaltest(s) (1.0491016699730547, 0.59182113002186942)

Si he entendido y usado la función correctamente, significa que los valores no están distribuidos normalmente. (Y honestamente no tengo idea de por qué hay una diferencia en la salida, es decir, menos detalles).

Estaba bastante seguro de que es una distribución normal (aunque mi conocimiento de las estadísticas es básico), y no sé cuál podría ser la alternativa. ¿Cómo puedo verificar cuál es la función de distribución de probabilidad en cuestión?

EDITAR:

Mi matriz Numpy que contiene 10000 valores se genera de esta manera (sé que no es la mejor manera de poblar una matriz Numpy), y luego se ejecuta el normaltest:

values = numpy.empty(shape=10000, 1)) for i in range(0, 10000): values[i] = measurement(...) # The function returns a float print normaltest(values)

EDIT 2:

Acabo de darme cuenta de que la discrepancia entre las salidas se debe a que inadvertidamente he usado dos funciones diferentes (scipy.stats.normaltest () y scipy.stats.mstats.normaltest ()), pero no hace una diferencia desde la parte relevante La salida es la misma independientemente de la función utilizada.

EDITAR 3:

Ajustando el histograma con la sugerencia de askewchan:

plt.plot(bin_edges, scipy.stats.norm.pdf(bin_edges, loc=values.mean(), scale=values.std()))

resultados en esto:

EDITAR 4:

Ajuste del histograma con la sugerencia del usuario user333700:

scipy.stats.t.fit(data)

resultados en esto:


Suponiendo que haya utilizado la prueba correctamente, mi conjetura es que tiene una pequeña desviación de una distribución normal y debido a que el tamaño de su muestra es tan grande, incluso pequeñas desviaciones conducirán a un rechazo de la hipótesis nula de una distribución normal.

Una posibilidad es inspeccionar visualmente sus datos trazando un histograma normed con un gran número de contenedores y el pdf con loc=data.mean() y scale=data.std() .

Hay pruebas alternativas para la prueba de normalidad, statsmodels tiene pruebas de Anderson-Darling y Lillifors (Kolmogorov-Smirnov) cuando se estiman los parámetros de distribución.

Sin embargo, espero que los resultados no difieran mucho dado el gran tamaño de la muestra.

La pregunta principal es si desea probar si su muestra proviene "exactamente" de una distribución normal, o si simplemente está interesado en saber si su muestra proviene de una distribución muy cercana a la distribución normal, cercana en términos de uso práctico. .

Para elaborar sobre el último punto:

http://jpktd.blogspot.ca/2012/10/tost-statistically-significant.html http://www.graphpad.com/guides/prism/6/statistics/index.htm?testing_for_equivalence2.htm

A medida que aumenta el tamaño de la muestra, una prueba de hipótesis gana más poder, eso significa que la prueba podrá rechazar la hipótesis nula de igualdad incluso para diferencias cada vez más pequeñas. Si mantenemos nuestro nivel de significación fijo, eventualmente rechazaremos pequeñas diferencias que realmente no nos interesan.

Un tipo alternativo de prueba de hipótesis es donde queremos mostrar que nuestra muestra está cerca de la hipótesis del punto dado, por ejemplo, dos muestras tienen casi la misma media. El problema es que tenemos que definir cuál es nuestra región de equivalencia.

En el caso de las pruebas de bondad de ajuste, debemos elegir una medida de distancia y definir un umbral para la medida de distancia entre la muestra y la distribución hipotética. No he encontrado ninguna explicación donde la intuición ayude a elegir este umbral de distancia.

stats.normaltest se basa en desviaciones de sesgo y kurtosis de las de la distribución normal.

Anderson-Darling se basa en una integral de las diferencias cuadradas ponderadas entre la cdf.

Kolmogorov-Smirnov se basa en la máxima diferencia absoluta entre el cdf.

Cincquare para datos agrupados se basaría en la suma ponderada de las probabilidades de los cuadrados al cuadrado.

y así.

Solo probé las pruebas de equivalencia con datos agrupados o discretizados, donde utilicé un umbral de algunos casos de referencia que todavía era bastante arbitrario.

En las pruebas de equivalencia médica, existen algunos estándares predefinidos para especificar cuándo se pueden considerar dos tratamientos como equivalentes, o similarmente como inferiores o superiores en la versión de un solo lado.