Sesión 3 - Parte 1

source('global.R')

Introducción a la inferencia estadística paramétrica

Una vez que sabemos describir nuestros datos y validar su distribución, el siguiente nivel es responder a las preguntas estratégicas de cualquier investigación. La inferencia estadística es el conjunto de técnicas que nos permite realizar afirmaciones sobre una población a partir de los datos observados en nuestra muestra.

En esta sesión, abordaremos cuatro tipos fundamentales de contrastes que todo investigador debe dominar:

  1. Test t para una muestra: Lo utilizaremos para comparar nuestro resultado actual frente a un valor de referencia, un objetivo histórico o un estándar poblacional conocido.
  2. Test t para muestras independientes: Es nuestra herramienta para comparar grupos distintos (ej. ¿se comportan igual los clientes de la Región A frente a los de la Región B?).
  3. Test t para muestras dependientes (o relacionadas): Nos permite medir la eficacia de una acción comparando el mismo grupo en dos momentos temporales diferentes (ej. antes y después de una campaña publicitaria).
  4. Correlación de Pearson: Es el primer paso para detectar asociaciones; nos permite saber si cuando una variable aumenta, la otra también lo hace (o decrece), cuantificando la fuerza de esa relación.

El enfoque de esta sesión: No aprenderemos a “clicar” opciones, sino a identificar qué pregunta estadística corresponde a cada problema de negocio. Una vez identificada la técnica, ejecutaremos el modelo en R, interpretaremos su significación y, sobre todo, aprenderemos a evaluar si los resultados obtenidos son robustos.

Estamos pasando de la observación simple a la toma de decisiones basada en evidencia estadística.

gssft1 <- read_spss('data/gssft1.sav')

Inferencia paramétrica

Test t de Student para una muestra

El test t para una muestra es nuestra primera herramienta de inferencia. Lo utilizaremos cuando necesitemos saber si la media de nuestra muestra es estadísticamente diferente a un valor de referencia (o valor poblacional).

Antes de ejecutar el test, nuestra hoja de ruta es:

  1. Descriptivos: Siempre visualizamos la media y el histograma. Si los datos están muy sesgados o tienen outliers extremos, el test t pierde potencia.
  2. Planteamiento de Hipótesis:
    • Hipótesis Nula (\(H_0\)): La media de la población es igual a nuestro valor de referencia (\(\mu = \mu_0\)).
    • Hipótesis Alternativa (\(H_1\)): La media es diferente (\(\mu \neq \mu_0\)).

En R, la función t.test() es extremadamente flexible. Definiremos todos sus parámetros para que el código sea transparente y no quede ninguna decisión estadística “oculta”:

# Defining our target (valor de referencia)
target_mean <- 40 

# Executing the t-test
test_t <- t.test(
    gssft1$hrs1,          # The variable to analyze
    na.rm = TRUE,          # Remove missing values
    mu = target_mean,      # The reference value
    alternative = "two.sided", # Looking for "difference" (not just greater/less)
    conf.level = 0.95      # Standard confidence level (95%)
)

# Printing the result
print(test_t)

    One Sample t-test

data:  gssft1$hrs1
t = 14.069, df = 438, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 40
95 percent confidence interval:
 46.22201 48.24268
sample estimates:
mean of x 
 47.23235 

Interpretación para el investigador: Al ejecutar el código, R nos devuelve tres datos críticos:

  • t-statistic: Indica cuántas desviaciones estándar se aleja nuestra media del valor objetivo.
  • p-value: Si es menor que 0.05, rechazamos la \(H_0\). Concluimos que la diferencia observada es estadísticamente significativa y no fruto del azar.
  • Confidence Interval (95% CI): Nos dice el rango donde, con un 95% de probabilidad, se encuentra la verdadera media poblacional. Si el valor de referencia (40) no está dentro de este rango, ya tenemos una prueba extra de que la media es significativamente distinta.

Test t de Student para muestras independientes

Este test nos permite determinar si existe una diferencia estadísticamente significativa entre las medias de dos grupos distintos (ej. ¿consumen más internet los hombres que las mujeres?).

El protocolo de decisión

Para aplicar correctamente este test, seguimos tres pasos obligatorios:

  1. Diagnóstico de varianzas (Levene): Comprobamos si los grupos tienen dispersiones similares. Si el p-value es \(> 0.05\), asumimos varianzas iguales (var.equal = TRUE). Si es \(\leq 0.05\), debemos usar la Corrección de Welch (var.equal = FALSE).
  2. Ejecución del test: Utilizamos la sintaxis de fórmulas variable_metrica ~ variable_factor.
  3. Tamaño del efecto: No basta con saber si hay diferencia; calculamos el r de Cohen (o eta-cuadrado mediante la fórmula de la \(t\) y los grados de libertad) para ver si esa diferencia es relevante en el mundo real.

Diagnóstico de homogeneidad (Test de Levene)

Antes de comparar medias, comprobamos si la variabilidad es similar en ambos grupos.

# Convertimos el sexo a factor
gssnet2$sex_factor <- factor(gssnet2$sex, labels = c("Hombre", "Mujer"))
Error:
! objeto 'gssnet2' no encontrado
# Test de Levene
leveneTest(emailhrs ~ sex_factor, data = gssnet2)
Error:
! objeto 'gssnet2' no encontrado

Ejecución del Test t de Student

Opción A: Varianzas iguales (Si Levene > 0.05)

Usamos var.equal = TRUE.

test_t_eq <- t.test(emailhrs ~ sex_factor, data = gssnet2, 
                    var.equal = TRUE, conf.level = 0.95)
Error:
! objeto 'gssnet2' no encontrado
print(test_t_eq)
Error:
! objeto 'test_t_eq' no encontrado
# Cálculo manual del tamaño del efecto (r de Cohen)
t_val <- test_t_eq$statistic
Error:
! objeto 'test_t_eq' no encontrado
df_val <- test_t_eq$parameter
Error:
! objeto 'test_t_eq' no encontrado
sqrt((t_val^2) / ((t_val^2) + df_val))
Error:
! objeto 't_val' no encontrado

Opción B: Varianzas diferentes (Si Levene ≤ 0.05)

Usamos var.equal = FALSE (Corrección de Welch).

test_t_welch <- t.test(emailhrs ~ sex_factor, data = gssnet2, 
                       var.equal = FALSE, conf.level = 0.95)
Error:
! objeto 'gssnet2' no encontrado
print(test_t_welch)
Error:
! objeto 'test_t_welch' no encontrado
# Cálculo manual del tamaño del efecto (r de Cohen)
t_val <- test_t_welch$statistic
Error:
! objeto 'test_t_welch' no encontrado
df_val <- test_t_welch$parameter
Error:
! objeto 'test_t_welch' no encontrado
sqrt((t_val^2) / ((t_val^2) + df_val))
Error:
! objeto 't_val' no encontrado

Aquí tienes el texto adaptado para tu documento Quarto, utilizando el nuevo objeto gssz y el enfoque de contraste de proporciones con el ejemplo de los grupos.


Test de comparación de proporciones (Test Z)

Cuando trabajamos con variables categóricas (como el grupo de pertenencia A, B o C), ya no comparamos medias, sino proporciones. El Test Z nos permite determinar si la diferencia entre las proporciones observadas en distintos grupos es estadísticamente significativa.

1. Preparación de los datos

Utilizaremos el archivo gssz, donde hemos definido grupos de pertenencia (grupo), sexo (sexo) y edad (edad).

gszz <- expss::read_spss('data/gszz.sav')
# Creamos la tabla de contingencia para observar las frecuencias
tabla_sexo <- table(gssz$sexo, gssz$grupo)
Error:
! objeto 'gssz' no encontrado
print(tabla_sexo)
Error:
! objeto 'tabla_sexo' no encontrado
round(prop.table(tabla_sexo,1)*100,2)
Error:
! objeto 'tabla_sexo' no encontrado

2. Ejecución del Test Z

Queremos verificar si la proporción de pertenencia al Grupo A es distinta entre Hombres y Mujeres.

# Extraemos los recuentos del Grupo A:
# Fila 1 = Hombre, Fila 2 = Mujer
exitos <- c(tabla_sexo["Hombre", "A"], tabla_sexo["Mujer", "A"])
Error:
! objeto 'tabla_sexo' no encontrado
# Calculamos los totales por sexo:
totales <- c(sum(tabla_sexo["Hombre", ]), sum(tabla_sexo["Mujer", ]))
Error:
! objeto 'tabla_sexo' no encontrado
# Ejecutamos el Test Z (prop.test)
prop.test(x = exitos, n = totales, correct = FALSE)
Error:
! objeto 'exitos' no encontrado

Interpretación para el investigador: * Hipótesis nula (\(H_0\)): La proporción de pertenencia al Grupo A es igual para hombres que para mujeres. * p-value: Si el valor es \(< 0.05\), rechazamos la igualdad. En nuestro caso, al haber forzado la generación de los datos, esperamos ver una diferencia clara. * Confidence interval: Si el intervalo no incluye el valor 0, la diferencia entre las proporciones es estadísticamente significativa.

Test t Student para la media de una muestra en grupos dependientes

x <- endorph1$before
Error:
! objeto 'endorph1' no encontrado
y <- endorph1$after
Error:
! objeto 'endorph1' no encontrado
media <- mean(x - y, na.rm = TRUE)
Error:
! objeto 'x' no encontrado
print(media)
Error:
! objeto 'media' no encontrado
desviacion <- sd(x - y, na.rm = TRUE)
Error:
! objeto 'x' no encontrado
print(desviacion)
Error:
! objeto 'desviacion' no encontrado
errormedia <- sd(x - y, na.rm = TRUE) / (sqrt(length(x)))
Error:
! objeto 'x' no encontrado
print(errormedia)
Error:
! objeto 'errormedia' no encontrado
int_inf <- media - (2 * errormedia)
Error:
! objeto 'media' no encontrado
print(int_inf)
Error:
! objeto 'int_inf' no encontrado
int_sup <- media + (2 * errormedia)
Error:
! objeto 'media' no encontrado
print(int_sup)
Error:
! objeto 'int_sup' no encontrado
lillieforsx <- lillie.test(x) ##  kolgomorov-smirnov con la correción de lilliefors
Error:
! objeto 'x' no encontrado
print(lillieforsx)
Error:
! objeto 'lillieforsx' no encontrado
lillieforsy <- lillie.test(y)
Error:
! objeto 'y' no encontrado
print(lillieforsy)
Error:
! objeto 'lillieforsy' no encontrado
shapirox <- shapiro.test(x) ##  shapiro - wilk
Error:
! objeto 'x' no encontrado
print(shapirox)
Error:
! objeto 'shapirox' no encontrado
shapiroy <- shapiro.test(y)
Error:
! objeto 'y' no encontrado
print(shapiroy)
Error:
! objeto 'shapiroy' no encontrado
test <- t.test(
    x,
    y,
    na.rm = TRUE,
    alternative = "two.sided", ##  alternativas cerradas: "two.sided", "less", "greater"
    paired = TRUE, ##  nótese que aquí es TRUE porque estamos en muestras pareadas
    conf.level = 0.95)
Error:
! objeto 'x' no encontrado
print(test)
Error:
! objeto 'test' no encontrado
##  cálculo del efecto tamaño
t3 <- test[["statistic"]][["t"]]
Error:
! objeto 'test' no encontrado
print(t3)
Error:
! objeto 't3' no encontrado
df3 <- test[["parameter"]][["df"]]
Error:
! objeto 'test' no encontrado
print(df3)
Error:
! objeto 'df3' no encontrado
effect_size3 <- sqrt((t3 ^ 2) / ((t3 ^ 2) + df3))
Error:
! objeto 't3' no encontrado
print(effect_size3)
Error:
! objeto 'effect_size3' no encontrado

Correlación paramétrica de Pearson

##  correlaciones
x <- anxiety$TIEMPO
Error:
! objeto 'anxiety' no encontrado
y <- anxiety$NOTA
Error:
! objeto 'anxiety' no encontrado
z <- anxiety$ANSIEDAD
Error:
! objeto 'anxiety' no encontrado
pearson.1 <- cor.test(
        x,
        y,
        alternative = "two.sided", ##  alternativas cerradas: "two.sided", "less", "greater"
        method = "pearson", ##  alternativas cerradas: "pearson", "kendall", "spearman"
        exact = NULL,
        conf.level = 0.95,
        continuity = FALSE)
Error:
! objeto 'x' no encontrado
print(pearson.1)
Error:
! objeto 'pearson.1' no encontrado
anxiety.filter <- select(anxiety, TIEMPO, NOTA, ANSIEDAD)
Error:
! objeto 'anxiety' no encontrado
## p.coef <-cor(anxiety.filter, use = "complete.obs", method = "pearson")
## p.cor <- cor(anxiety.filter, use = "pairwise.complete.obs") 
p.pvalue <- rcorr(as.matrix(anxiety.filter), type = "pearson") ## se obtiene la matriz de correlación
Error:
! objeto 'anxiety.filter' no encontrado
p.pvalue[["r"]] ##  matriz de correlación
Error:
! objeto 'p.pvalue' no encontrado
p.pvalue[["n"]] ##  pares analizados
Error:
! objeto 'p.pvalue' no encontrado
p.pvalue[["P"]] ##  pvalue de los coeficientes
Error:
! objeto 'p.pvalue' no encontrado
plot(anxiety.filter) ## se obtiene el gráfico de dispersión
Error in `h()`:
! error al evaluar el argumento 'x' al seleccionar un método para la función 'plot': objeto 'anxiety.filter' no encontrado

Análisis de varianza de un factor (vía)

Nota: la variable de grupos ha de ser factor; si no es así no funciona el análisis.

hatco$X14f <- factor(hatco$X14, labels = c("nueva", "recompra modificada", "recompra"))
Error:
! objeto 'hatco' no encontrado
hatco$X13f <- factor(hatco$X13, labels = c("tipo 1", "tipo2"))
Error:
! objeto 'hatco' no encontrado
boxplot(hatco$X10 ~ hatco$X14f, col = "lightgray")
Error:
! objeto 'hatco' no encontrado
boxplot(hatco$X10 ~ hatco$X13f, col = "lightgray")
Error:
! objeto 'hatco' no encontrado
anova1 <- aov(hatco$X10 ~ hatco$X14f)
Error:
! objeto 'hatco' no encontrado
print(anova1)
Error:
! objeto 'anova1' no encontrado
summary(anova1)
Error:
! objeto 'anova1' no encontrado
model.tables(anova1, "means")
Error:
! objeto 'anova1' no encontrado

Análisis de varianza de dos factores (vías)

anova2 <- aov(hatco$X10 ~ hatco$X14f + hatco$X13f)
Error:
! objeto 'hatco' no encontrado
print(anova2)
Error:
! objeto 'anova2' no encontrado
summary(anova2)
Error:
! objeto 'anova2' no encontrado
model.tables(anova2, "means")
Error:
! objeto 'anova2' no encontrado

Inferencia no paramétrica

Prueba Chi

Prueba Chi2 de una muestra

El test chi2 para una muestra, compara los resultados de una distribución marginal con los resultados proporcionados de forma externa.

x <- c(28, 47, 80, 82, 47, 35)
y <- c(30, 50, 75, 75, 50, 30)
chisq000 <- chisq.test(x, p = y, rescale.p = TRUE)
print(chisq000)

    Chi-squared test for given probabilities

data:  x
X-squared = 1.9941, df = 5, p-value = 0.85

Prueba Chi2 de una tabla

tabla001 <-  table(data2$freedman, data2$sex)
Error:
! objeto 'data2' no encontrado
print(tabla001)
Error:
! objeto 'tabla001' no encontrado
chisq001 <- chisq.test(tabla001, correct = FALSE) ## prueba chi2 de tabla sin corrección de continuidad de Yates (solo en 2*2)
Error:
! objeto 'tabla001' no encontrado
print(chisq001)
Error:
! objeto 'chisq001' no encontrado
chisq002 <- chisq.test(tabla001, correct = TRUE) ## prueba chi2 de tabla con corrección de continuidad, como es 2*2 aplica por defecto, si no fuera 2*2 no aplica la corrección
Error:
! objeto 'tabla001' no encontrado
print(chisq002)
Error:
! objeto 'chisq002' no encontrado

Otros test derivados

otros <- assocstats(tabla001)
Error:
! objeto 'tabla001' no encontrado
print(otros)
Error:
! objeto 'otros' no encontrado

Correlaciones no paramétricas

Correlación de Spearman

x <- grades$Estadística
Error:
! objeto 'grades' no encontrado
y <- grades$Selectivo
Error:
! objeto 'grades' no encontrado
spearman.1 <- cor.test(
        x,
        y,
        alternative = "two.sided",
        method = "spearman",
        exact = NULL,
        conf.level = 0.95,
        continuity = FALSE)

Correlación de Kendall

tau.b.kendall.1 <- cor.test(
        x,
        y,
        alternative = "two.sided",
        method = "kendall",
        exact = NULL,
        conf.level = 0.95,
        continuity = FALSE)

Test de diferencias de una muestra en grupos independientes

Probamos la normalidad de los grupos a comparar. Probamos la normalidad de cada grupo en cada variable y una vez probado que existen problemas de normalidad en algunos de los grupos, calculamos la prueba W de Wilcoxon.

Lilliefors y Shapiro-Wilk

x <- bdi$sunbdi
Error:
! objeto 'bdi' no encontrado
y <- bdi$wedbdi
Error:
! objeto 'bdi' no encontrado
z <- bdi$droga
Error:
! objeto 'bdi' no encontrado
bdi.filter <- filter (bdi, bdi$droga == 1)
Error:
! objeto 'bdi' no encontrado
es <- bdi.filter$sunbdi ##  alcohol domingo
Error:
! objeto 'bdi.filter' no encontrado
bdi.filter <- filter (bdi, bdi$droga == 2)
Error:
! objeto 'bdi' no encontrado
as <- bdi.filter$sunbdi ##  extasis domingo
Error:
! objeto 'bdi.filter' no encontrado
bdi.filter <- filter (bdi, bdi$droga == 1)
Error:
! objeto 'bdi' no encontrado
ew <- bdi.filter$wedbdi ##  alcohol miercoles
Error:
! objeto 'bdi.filter' no encontrado
bdi.filter <- filter (bdi, bdi$droga == 2)
Error:
! objeto 'bdi' no encontrado
aw <- bdi.filter$wedbdi ##  extasis miercoles
Error:
! objeto 'bdi.filter' no encontrado
rm(bdi.filter)

lillie.sun.1 <- lillie.test(es)
Error:
! objeto 'es' no encontrado
print(lillie.sun.1)
Error:
! objeto 'lillie.sun.1' no encontrado
shap.sun.1 <- shapiro.test(es)
Error:
! objeto 'es' no encontrado
print(shap.sun.1)
Error:
! objeto 'shap.sun.1' no encontrado
lillie.sun.2 <- lillie.test(as)
Error in `complete.cases()`:
! 'tipo' (closure) de argumento inválido
print(lillie.sun.2)
Error:
! objeto 'lillie.sun.2' no encontrado
shap.sun.2 <- shapiro.test(as)
Error in `shapiro.test()`:
! is.numeric(x) is not TRUE
print(shap.sun.2)
Error:
! objeto 'shap.sun.2' no encontrado
lillie.wed.1 <- lillie.test(ew)
Error:
! objeto 'ew' no encontrado
print(lillie.wed.1)
Error:
! objeto 'lillie.wed.1' no encontrado
shap.wed.1 <- shapiro.test(ew)
Error:
! objeto 'ew' no encontrado
print(shap.wed.1)
Error:
! objeto 'shap.wed.1' no encontrado
lillie.wed.2 <- lillie.test(aw)
Error:
! objeto 'aw' no encontrado
print(lillie.wed.2)
Error:
! objeto 'lillie.wed.2' no encontrado
shap.wed.2 <- shapiro.test(aw)
Error:
! objeto 'aw' no encontrado
print(shap.wed.2)
Error:
! objeto 'shap.wed.2' no encontrado

Prueba W de Wilcoxon - U Mann-Withney

Aunque la probabilidad no es exactamente la misma, es muy aproximada.

wilcox.test.1 <- wilcox.test(as, es, paired = FALSE, alternative = "two.sided", mu = 0, conf.int = 0.95)
Error in `wilcox.test.default()`:
! 'x' debe ser numérico
print(wilcox.test.1)
Error:
! objeto 'wilcox.test.1' no encontrado
wilcox.test.2 <- wilcox.test(aw, ew, paired = FALSE, alternative = "two.sided", mu = 0, conf.int = 0.95)
Error:
! objeto 'aw' no encontrado
print(wilcox.test.2)
Error:
! objeto 'wilcox.test.2' no encontrado

Test de diferencias de una muestra en grupos dependientes

Prueba V de Wilcoxon

Atención, resultado de la prueba es suma de rangos negativos. no es el mismo resultado que SPSS el valor, pero si la probabilidad aproximada.

wilcox.test.3 <- wilcox.test(es, ew, paired = TRUE, alternative = "two.sided", mu = 0, conf.int = 0.99)
Error:
! objeto 'es' no encontrado
print(wilcox.test.3)
Error:
! objeto 'wilcox.test.3' no encontrado
wilcox.test.4 <- wilcox.test(as, aw, paired = TRUE, alternative = "two.sided", mu = 0, conf.int = 0.99)
Error in `wilcox.test.default()`:
! 'x' debe ser numérico
print(wilcox.test.4)
Error:
! objeto 'wilcox.test.4' no encontrado