Experimentos múltiples: teoría y práctica

En el mundo actual, es difícil imaginar el desarrollo de productos sin pruebas A / B. Para lanzar con éxito un producto o una nueva funcionalidad, debe diseñar correctamente A / B, calcular e interpretar sus resultados. A veces necesitamos pruebas para más de dos grupos. En este artículo, consideraremos un caso así: pruebas múltiples:

  • Hablaremos sobre cuándo y por qué realizar múltiples pruebas;
  • considerar los principales métodos para calcular los resultados de las pruebas y los principios matemáticos en los que se basan los métodos;
  • damos ejemplos de la implementación de software de los métodos; Puede usar estos ejemplos en sus proyectos.

Entonces comencemos.



Múltiples experimentos: cuándo y por qué


Obviamente, cualquier complicación técnica del experimento debe justificarse por necesidad práctica. Esto también se aplica a múltiples pruebas. Si la audiencia se divide en más de dos subgrupos, la probabilidad de obtener un error de primer tipo durante el experimento aumenta exponencialmente:

1(1 alpha)n,


donde n- el número de subgrupos,  alpha- un determinado nivel de significación estadística.
Por lo tanto, al agregar solo un subgrupo adicional a la prueba de pares habitual ( n=3) en un nivel estándar dado  alpha=0.05obtenemos la probabilidad de un error de primer tipo p=0.14que excede significativamente nuestro objetivo  alpha=0.05.

¿Por qué hacer múltiples experimentos si reducen la precisión de los resultados de la investigación? Puede haber varias razones:

  1. Es necesario probar varios cambios y su efecto acumulativo en las métricas del producto. Un ejemplo es mostrar al usuario en la página de servicio dos elementos nuevos que están ubicados de manera diferente entre sí.
  2. Los cambios solo se pueden probar en un período de tiempo, ya que son interdependientes y sensibles a la estacionalidad semanal. Un ejemplo es deshabilitar los canales publicitarios para calcular el efecto de la canibalización entre canales.
  3. El cliente desea recibir una respuesta lo antes posible y más barata, cuál de las opciones se debe elegir, ahorrando al mismo tiempo el desarrollo y la implementación del experimento.

Si nos enfrentamos a uno de estos problemas y tenemos que calcular la significancia estadística para la prueba, debemos considerar la necesidad de correcciones para pruebas múltiples. Sobre qué es y cómo hacerlo bien, y se discutirá a continuación.

Múltiples experimentos: características de cálculo


Conceptos basicos


Considere el caso general cuando se trata de nhipótesis H0i, i=1,...,nsobre igualdad de pares de mediana o promedio msubgrupos En este caso, tanto el resultado verdadero como el incorrecto son posibles. H0iVSH1ipara cada uno de i=1,...,nhipótesis Presente los resultados como un experimento de matriz de confusión:

H0ino rechazadoH0irechazadoTotal

H0icierto

UVn0
H0imalTSn1
TotalkRRn


Por lo tanto, rechazado incorrectamente Vde Rrechazó hipótesis básicas.

En base a estos parámetros, presentamos dos conceptos importantes de errores, que se controlan durante las pruebas múltiples: FWERy Fdr.

Probabilidad de error grupal FWER(Tasa de error familiar) es la probabilidad de obtener al menos un error del primer tipo y está determinada por la fórmula:

FWER=p(V>0).



Fdr(False Discovery Rate) es la expectativa matemática de la relación de errores del primer tipo al número total de desviaciones de la hipótesis principal:

FDR=E(V/R|R>0).



Considere los métodos para controlar estos errores utilizando el ejemplo de un caso de producto estándar.

Descripción del caso


Como un ejemplo simple, considere un experimento en el que a tres grupos de usuarios aislados y disjuntos se les mostraron tres opciones de página con una oferta para hacer clic en el botón de llamada de un anuncio. Como métrica básica para la simplicidad de cálculo, tomamos el número total de llamadas en cada grupo.

Veamos cómo cambió la métrica en estudio:


Fig. 1. El gráfico de la dinámica de presionar el botón de llamada



Usaremos el método estándar bootstrappara que la distribución de la métrica objetivo en las muestras sea normal, y observe los histogramas y los gráficos de rango de los valores promedio en las muestras:


Fig. 2. El histograma de la distribución de valores promedio en grupos.


Fig. 3. El rango de valores promedio en grupos



A juzgar por los gráficos, el grupo C gana por el número de clics en el botón de llamada. Sin embargo, es necesario verificar la significación estadística de los resultados. Para hacer esto, llevamos la métrica estimada a la forma de la distribución normal y usamos el criterio t de Student habitual para la comparación por pares de grupos en el experimento, y luego - métodos de control FWERy Fdrpara tener en cuenta las correcciones para comparaciones múltiples.

Control FWER


Existen muchos métodos para controlar este error, pero dos son los más comunes:

1) procedimiento de un paso con ajuste simultáneo valorppara todas las hipótesis probadas utilizando el método Bonferroni;

2) ajuste secuencial e iterativo valorpc toma de decisiones en cada paso de acuerdo con el resultado del método Hill.

1. Enmienda de Bonferroni


Este procedimiento de un solo paso reduce la probabilidad de un resultado falso positivo del experimento. La esencia del método es aceptar una hipótesis alternativa si:

p alpha/n,


donde n- el número de hipótesis probadas.

El método puede implementarse simplemente usando la biblioteca estándar bootstrapped:

from bootstrapped import bootstrap as bs from bootstrapped import compare_functions as bs_cmp from bootstrapped import stats_functions as bs_st bs_ab_estims = bs.bootstrap_ab(np.array(group_A), np.array(group_B), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4) bs_bc_estims = bs.bootstrap_ab(np.array(group_B), np.array(group_C), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4) bs_ac_estims = bs.bootstrap_ab(np.array(group_A), np.array(group_C), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4) 

Una vez obtenidos los resultados de una evaluación estadística, podemos concluir si los grupos difieren o no.

El principal inconveniente del enfoque: cuantos más subgrupos, menor es el poder del criterio, lo que aumenta la probabilidad de aceptar la hipótesis incorrecta. Por ejemplo, para diez pruebas y αi=0.05necesita conseguir pi5103decir que la diferencia es significativa. Para nivelar estas deficiencias, puede elegir el método Hill.

2. Método de la colina


Este es un procedimiento de cambio secuencial hacia abajo. valorp. En el primer paso del algoritmo del método, real valorpordenados ascendentes:

p1···pn,


entonces el original  alpha-nivel:

 alphai= alpha/(ni+1),


después de lo cual se verifica la condición pi alphaiy concluye si la hipótesis principal es verdadera H0i.

Punto de corte del algoritmo: momento i cuando se acepta la primera hipótesis principal H0iy todos los posteriores H0j,j>i.
Puede implementar este método usando el procedimiento multipletests()de la biblioteca statsmodelscon parámetro método="holm":

 from bootstrapped import bootstrap as bs from bootstrapped import stats_functions as bs_st from scipy.stats import ttest_ind from statsmodels.sandbox.stats.multicomp import multipletests bs_a = bs.bootstrap(np.array(group_A), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) bs_b = bs.bootstrap(np.array(group_B), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) bs_c = bs.bootstrap(np.array(group_C), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) stat_ab, p_ab = stats.ttest_ind(pd.DataFrame(bs_a), pd.DataFrame(bs_b)) stat_bc, p_bc = stats.ttest_ind(pd.DataFrame(bs_b), pd.DataFrame(bs_c)) stat_ac, p_ac = stats.ttest_ind(pd.DataFrame(bs_a), pd.DataFrame(bs_c)) print(sorted([p_ab, p_bc, p_ac])) print("FWER: " + str(multipletests(sorted([p_ab, p_bc, p_ac]), alpha=0.05, method='holm', is_sorted = True))) 

Control FDR


Control Fdrsignifica que se cumple la condición FDR=E(V/R)< alpha. Al mismo tiempo FDRFWER, es decir, la probabilidad de obtener un error de primer orden en el control Fdren declive

Método Benjamini-Hochberg


Este procedimiento ascendente implica un cambio secuencial. valorppre-ordenado ascendente:

p1···pn.


Entonces fuente α-nivel se ajusta mediante la fórmula:

 alphai=i· alpha/n,


entonces, como en el método Holm, se verifica la condición pi alphaiy concluye si la hipótesis principal es verdadera H0iy todo posterior H0j,j>i.

El método Benjamini-Hochberg, así como el método Holm, se pueden implementar utilizando el procedimiento multipletests():

 print("FDR: " + str(multipletests([p_ab, p_bc, p_ac], alpha=0.05, method='fdr_bh', is_sorted = False))) 

Conclusión


En el artículo hablamos sobre los principales métodos para evaluar los resultados de múltiples pruebas y proporcionamos ejemplos de código de programa que implementa estos métodos. Esperamos que haya pasado tiempo con beneficio e interés y pueda poner en práctica los procedimientos descritos. Y si tiene alguna pregunta, estaremos encantados de responderla.

Gracias por su atencion!

Source: https://habr.com/ru/post/476826/


All Articles