es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pruebe 80,000+ conjuntos de observaciones simuladas con distribución normal en contra de una hipótesis nula.

Necesito generar una muestra aleatoria de tamaño 200 (n=200) a partir de una distribución normal con una varianza de 1 y un mu verdadero (promedio) que especifico; luego, pruebo la muestra contra una hipótesis: mu <= 1. Necesito hacer esto para cada uno de los 400 theta verdaderos posibles, y para cada theta verdadero necesito replicarlo 200 veces.

Ya hice esto para n=1, pero me doy cuenta de que mi enfoque no es replicable. Para cada uno de los 400 thetas, ejecuté lo siguiente:

sample_r200n1_t1=normal(loc=-1, scale=1, size=200)
sample_r200n1_t2=normal(loc=-0.99, scale=1, size=200)
sample_r200n1_t3=normal(loc=-0.98, scale=1, size=200)
sample_r200n1_t4=normal(loc=-0.97, scale=1, size=200)
sample_r200n1_t5=normal(loc=-0.96, scale=1, size=200)
... y así sucesivamente hasta loc = 3

Luego, probé cada elemento en el arreglo generado por separado. Sin embargo, ese enfoque requeriría que generara decenas de miles de muestras, generara el promedio asociado a cada una y luego probara ese promedio contra mis criterios. Esto tendría que hacerse 80,000 veces (y además, necesito hacer esto para varios tamaños diferentes de n). Claramente, este no es el enfoque correcto a tomar.

¿Cómo puedo lograr los resultados que estoy buscando? ¿Existe alguna manera, por ejemplo, de generar un arreglo de promedios de muestras y colocar esos promedios en un arreglo, uno por cada theta? Luego podría probar como antes. ¿O existe otra forma?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay un enfoque mejor para lograr el resultado deseado. En lugar de generar muestras individuales para cada theta, podemos generar una matriz de medias para cada theta, que luego podemos probar con nuestro criterio. Aquí hay una posible forma de implementar este enfoque usando Python:

    1. Primero, definimos los parámetros de la distribución normal:
    mu_true = np.linspace(-3, 3, 400) # 400 thetas potenciales verdaderos
    varianza = 1
    n = 200
    
    1. Luego, generamos una matriz 2D de muestras aleatorias usando np.random.normal:
    muestras = np.random.normal(loc=mu_true.reshape(-1, 1), scale=np.sqrt(varianza), size=(400, n))
    

    Esto genera una matriz de tamaño (400, 200), donde cada fila corresponde a un valor diferente de mu_true. Reshapeamos el arreglo unidimensional mu_true a un vector de columna de forma (400, 1) para transmitirlo a través de las filas de la matriz.

    1. A continuación, calculamos la media de cada fila usando np.mean:
    medias_muestras = np.mean(muestras, axis=1)
    

    Esto genera una matriz de tamaño (400,), donde cada elemento corresponde a la media de las 200 muestras generadas para un valor dado de mu_true.

    1. Finalmente, probamos cada media de muestra contra la hipótesis mu <= 1 utilizando una prueba t unilateral con un nivel de significancia de 0.05:
    from scipy.stats import ttest_1samp
    
    rechazar = np.zeros_like(mu_true, dtype=bool)
    
    for i in range(len(mu_true)):
        estad_t, valor_p = ttest_1samp(muestras[i], 1)
        rechazar[i] = valor_p < 0.05 y estad_t > 0
    

    Esto genera una matriz booleana de tamaño (400,), donde cada elemento corresponde al rechazo (o aceptación) de la hipótesis nula para un valor dado de mu_true. Utilizamos scipy.stats.ttest_1samp para calcular la estadística t y el valor p para cada media de muestra con respecto a la hipótesis nula mu = 1.

    La ventaja de este enfoque es que genera todas las muestras y calcula sus medias en un solo paso, lo cual es más eficiente que generar cada muestra por separado. Además, nos permite probar las medias contra la hipótesis de una manera vectorizada, lo cual también es más eficiente que probar cada muestra individualmente.

Comments are closed.