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.

Aplica una función a cada elemento de un arreglo en Python.

Estoy intentando hacer dos cosas en Python:
1. Simular 100 extracciones aleatorias de una distribución de Poisson. Lo he hecho de la siguiente manera:

sample100 = poisson.rvs(mu=5,size=100)
  1. Tomar la muestra anterior y aplicar una prueba UMP que he generado a cada observación individual (es decir, probar la hipótesis contra cada observación individual). La prueba debe aceptar la hipótesis nula si la observación tiene un valor < 8; rechazar con una probabilidad del ~50% si la observación tiene un valor = 8; rechazar si la observación tiene un valor > 8.

No puedo entender cómo hacer la segunda parte de esto. El código de la función que he creado es:

    def optionaltest(y,k,g):

    if (y > k):
        return 1
    if (y == k):
        if np.random.uniform(0,1) >= 0.4885: return 1
        else: return 0
    if (y < k):
        return 0

Pero hay dos problemas: aparentemente, la condición (y == k) es una sintaxis inválida. Segundo, incluso si elimino esa parte, no puedo aplicar la función a sample100 ya que es una matriz.

¿Cómo puedo modificar esto para que funcione? Claramente, soy muy nuevo en Python, pero he estado buscando en internet durante horas. ¿Quizás debería cambiar la forma en que genero mis datos de muestra para poder aplicar una función a ellos? ¿Quizás hay una forma de aplicar una función a cada elemento de una matriz? ¿Cómo puedo hacer que la lógica de la prueba funcione cuando la salida = k (que en este caso estableceré en 8)?

EDIT/ACTUALIZACIÓN:
Así es como terminé haciéndolo:

    def optionaltest(y):

    if (y > 8):
        return 1
    if (y == 8):
        if np.random.uniform(0,1) >= 0.4885: return 1
        else: return 0
    if (y < 8):
        return 0

pude aplicar esa prueba a mis datos de matriz a través de:

results_sample100 = list(map(optionaltest, sample100))
cl.Counter(results_sample100)
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para aplicar la prueba UMP a cada observación individual en sample100, puedes usar la función map para aplicar la función optionaltest a cada elemento del arreglo. Aquí tienes un ejemplo:

    import numpy as np
    from scipy.stats import poisson
    
    def optionaltest(y):
        if (y > 8):
            return 1
        if (y == 8):
            if np.random.uniform(0,1) >= 0.4885: 
                return 1
            else: 
                return 0
        if (y < 8):
            return 0
    
    sample100 = poisson.rvs(mu=5,size=100)
    results_sample100 = list(map(optionaltest, sample100))
    

    En este ejemplo, he modificado la función optionaltest para usar np.random.uniform en lugar de rand(uniform(0,1)). También he eliminado el parámetro g ya que no se utiliza en la función.

    Para usar map, se pasa la función (optionaltest) como primer argumento y el arreglo (sample100) como segundo argumento. map aplicará la función a cada elemento del arreglo y devolverá una lista con los resultados.

    Finalmente, para contar el número de veces que se aceptó o rechazó la hipótesis nula, puedes usar la función Counter del módulo collections:

    import collections as cl
    counts = cl.Counter(results_sample100)
    

    Esto devolverá un objeto similar a un diccionario donde las claves son los valores de retorno de optionaltest (0 o 1) y los valores son las cuentas de cada valor de retorno.

Comments are closed.