En R es una función muy útil que ayuda con la determinación de los parámetros de un dos caras t-test, con el fin de obtener un objetivo de poder estadístico.

Se llama a la función power.prop.test.

http://stat.ethz.ch/R-manual/R-patched/library/stats/html/power.prop.test.html

Se le puede llamar usando:

power.prop.test(p1 = .50, p2 = .75, power = .90)

Y le dirá n el tamaño de muestra necesario para obtener este poder. Esto es muy útil para disuadir a los tamaños de muestra para los ensayos.

Hay una función similar en el paquete scipy?

  • Creo que sería aquí si existe.
  • Esa función también está escrito en puro R llamar por teléfono sin () mostrará el código fuente. El puerto de numpy será sencillo si no existe ya.
  • Gracias @Justin esto ayudó en la creación de los de abajo.
  • Gracias @Raufio he utilizado la página que enlaza a encontrar la isf función a continuación.
InformationsquelleAutor Matt Alcock | 2013-03-04

4 Comentarios

  1. 21

    He conseguido replicar la función utilizando la siguiente fórmula para el n y la inversa de la función de sobrevivencia norm.isf de scipy.estadísticas

    Hay un python (scipy) función para determinar los parámetros necesarios para obtener un objetivo de potencia?

    from scipy.stats import norm, zscore
    
    def sample_power_probtest(p1, p2, power=0.8, sig=0.05):
        z = norm.isf([sig/2]) #two-sided t test
        zp = -1 * norm.isf([power]) 
        d = (p1-p2)
        s =2*((p1+p2) /2)*(1-((p1+p2) /2))
        n = s * ((zp + z)**2) / (d**2)
        return int(round(n[0]))
    
    def sample_power_difftest(d, s, power=0.8, sig=0.05):
        z = norm.isf([sig/2])
        zp = -1 * norm.isf([power])
        n = s * ((zp + z)**2) / (d**2)
        return int(round(n[0]))
    
    if __name__ == '__main__':
    
        n = sample_power_probtest(0.1, 0.11, power=0.8, sig=0.05)
        print n  #14752
    
        n = sample_power_difftest(0.1, 0.5, power=0.8, sig=0.05)
        print n  #392
    • Han considerado que la donación de este a SciPy? Es sin duda una útil función.
    • Suena como una buena idea de cómo tendría que hacer esto @larsmans
    • Usted necesita para inscribirse en GitHub, luego de la horquilla su repo, poner los cambios y enviar una solicitud de extracción. (Por desgracia, la SciPy la documentación para los desarrolladores es un poco de lío en la actualidad…)
    • Gracias @larsmans estoy en github, así que voy tenedor y hacer sólo esto. Saludos
    • Esto se ve muy prometedor. Cualquier posibilidad de que usted puede abordar @erikwestlund la respuesta de abajo?
    • Supongo que: d = diferencia de los medios) y (s = diferencia de la ets). Pero, ¿cuáles son p1 y p2?
    • Puede agregar una referencia a la captura de pantalla de la fórmula?

  2. 10

    Algunos de los básicos de cálculo de la potencia están disponibles ahora en statsmodels

    http://statsmodels.sourceforge.net/devel/stats.html#power-and-sample-size-calculations
    http://jpktd.blogspot.ca/2013/03/statistical-power-in-statsmodels.html

    El artículo en el blog todavía no tiene los cambios más recientes de la statsmodels código en cuenta. Además, aún no he decidido aún cómo muchas funciones de contenedor para ofrecer, ya que muchos de los cálculos de la potencia, reducir a la base de la distribución.

    >>> import statsmodels.stats.api as sms
    >>> es = sms.proportion_effectsize(0.5, 0.75)
    >>> sms.NormalIndPower().solve_power(es, power=0.9, alpha=0.05, ratio=1)
    76.652940372066908

    De R estadísticas

    > power.prop.test(p1 = .50, p2 = .75, power = .90)
    
         Two-sample comparison of proportions power calculation 
    
                  n = 76.7069301141077
                 p1 = 0.5
                 p2 = 0.75
          sig.level = 0.05
              power = 0.9
        alternative = two.sided
    
     NOTE: n is number in *each* group 

    el uso de R pwr paquete

    > library(pwr)
    > h<-ES.h(0.5,0.75)
    > pwr.2p.test(h=h, power=0.9, sig.level=0.05)
    
         Difference of proportion power calculation for binomial distribution (arcsine transformation) 
    
                  h = 0.5235987755982985
                  n = 76.6529406106181
          sig.level = 0.05
              power = 0.9
        alternative = two.sided
    
     NOTE: same sample sizes 
    • Algo está mal con esto, las respuestas producidas varían dependiendo de si se usa R o Python, especialmente cuando se varía la relación. Alguna idea de lo que está mal?
    • Es R stats y Stata frente a R pwr y statsmodels. Consulte github.com/statsmodels/statsmodels/issues/1197 y asociada a la lista de correo de hilo para más detalles. No recuerdo dónde SAS es en este.
  3. 7

    Matt respuesta para la obtención de los necesarios n (por grupo) es casi correcta, pero hay un pequeño error.

    D (diferencia de medias), s (desviación estándar), sig (nivel de significación, normalmente .05) y de alimentación (normalmente .80), la fórmula para calcular el número de observaciones por grupo:

    n= (2s^2 * ((z_(sig/2) + z_power)^2) / (d^2)

    Como se puede ver en su fórmula, ha

    n = s * ((zp + z)**2) / (d**2)

    la «s» de la parte que está mal. una correcta función que reproduce r funcionalidad es:

    def sample_power_difftest(d, s, power=0.8, sig=0.05):
        z = norm.isf([sig/2]) 
        zp = -1 * norm.isf([power])
        n = (2*(s**2)) * ((zp + z)**2) / (d**2)
        return int(round(n[0]))

    Espero que esto ayude.

  4. 1

    Usted también tiene:

    from statsmodels.stats.power import tt_ind_solve_power

    y escriba «Ninguno» en el valor que se desea obtener. Para instande, para obtener el número de observaciones en el caso de effect_size = 0.1, potencia = 0,8 y así sucesivamente, usted debe poner:

    tt_ind_solve_power(effect_size=0.1, nobs1 = None, alpha=0.05, power=0.8, ratio=1, alternative='two-sided')

    y obtener: 1570.7330663315456 como el número de observaciones requeridas.
    O bien, para obtener la potencia que puede alcanzar con el resto de los valores fijos:

    tt_ind_solve_power(effect_size= 0.2, nobs1 = 200, alpha=0.05, power=None, ratio=1, alternative='two-sided')

    y obtener: 0.5140816347005553

Dejar respuesta

Please enter your comment!
Please enter your name here