library(rio)
linkGIT="https://github.com/JoseManuelMagallanes/Estadistica_Para_AnalisisPolitico/raw/master/hsb.sav"
hsb=import(linkGIT)
str(hsb,strict.width="cut",width=50)
## 'data.frame': 600 obs. of 15 variables:
## $ ID : num 1 2 3 4 5 6 7 8 9 10 ...
## ..- attr(*, "format.spss")= chr "F5.0"
## $ SEX : num 2 1 2 2 2 1 1 2 1 2 ...
## ..- attr(*, "format.spss")= chr "F5.0"
## $ RACE : num 2 2 2 2 2 2 2 2 2 2 ...
## ..- attr(*, "format.spss")= chr "F5.0"
## $ SES : num 1 1 1 2 2 2 1 1 2 1 ...
## ..- attr(*, "format.spss")= chr "F5.0"
## $ SCTYP : num 1 1 1 1 1 1 1 1 1 1 ...
## ..- attr(*, "format.spss")= chr "F5.0"
## $ HSP : num 3 2 2 3 3 2 1 1 1 1 ...
## ..- attr(*, "format.spss")= chr "F5.0"
## $ LOCUS : num 0.29 -0.42 0.71 0.06 0.22 0.46 0..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ CONCPT: num 0.88 0.03 0.03 0.03 -0.28 0.03 -..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ MOT : num 0.67 0.33 0.67 0 0 0 0.33 1 0.33..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ CAR : num 10 2 9 15 1 11 10 9 9 11 ...
## ..- attr(*, "format.spss")= chr "F5.0"
## $ RDG : num 33.6 46.9 41.6 38.9 36.3 49.5 62..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ WRTG : num 43.7 35.9 59.3 41.1 48.9 46.3 64..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ MATH : num 40.2 41.9 41.9 32.7 39.5 46.2 48..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ SCI : num 39 36.3 44.4 41.7 41.7 41.7 63.4..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ CIV : num 40.6 45.6 45.6 40.6 45.6 35.6 55..
## ..- attr(*, "format.spss")= chr "F5.2"
Formatear: 2. Lea la metadata,y de formato:
hsb$ID=as.character(hsb$ID)
hsb[,c(2,3,5,6,10)]=lapply(hsb[,c(2,3,5,6,10)],as.factor)
hsb$HSP=as.ordered(hsb$HSP)
Ahora:
str(hsb,strict.width="cut",width=50)
## 'data.frame': 600 obs. of 15 variables:
## $ ID : chr "1" "2" "3" "4" ...
## $ SEX : Factor w/ 2 levels "1","2": 2 1 2 2 2..
## $ RACE : Factor w/ 4 levels "1","2","3","4": 2..
## $ SES : num 1 1 1 2 2 2 1 1 2 1 ...
## ..- attr(*, "format.spss")= chr "F5.0"
## $ SCTYP : Factor w/ 2 levels "1","2": 1 1 1 1 1..
## $ HSP : Ord.factor w/ 3 levels "1"<"2"<"3": 3..
## $ LOCUS : num 0.29 -0.42 0.71 0.06 0.22 0.46 0..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ CONCPT: num 0.88 0.03 0.03 0.03 -0.28 0.03 -..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ MOT : num 0.67 0.33 0.67 0 0 0 0.33 1 0.33..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ CAR : Factor w/ 17 levels "1","2","3","4",...
## $ RDG : num 33.6 46.9 41.6 38.9 36.3 49.5 62..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ WRTG : num 43.7 35.9 59.3 41.1 48.9 46.3 64..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ MATH : num 40.2 41.9 41.9 32.7 39.5 46.2 48..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ SCI : num 39 36.3 44.4 41.7 41.7 41.7 63.4..
## ..- attr(*, "format.spss")= chr "F5.2"
## $ CIV : num 40.6 45.6 45.6 40.6 45.6 35.6 55..
## ..- attr(*, "format.spss")= chr "F5.2"
f1=formula(MATH ~ SEX)
aggregate(f1, hsb, mean)
## SEX MATH
## 1 1 52.34542
## 2 2 51.43456
Podemos inferir que a los hombres les va mejor en MATH? Se puede afirmar que sí, porque tienen mayor rendimiento que las mujeres.
f2=formula(MATH ~ HSP)
aggregate(f2, hsb,mean)
## HSP MATH
## 1 1 55.81071
## 2 2 49.09172
## 3 3 46.26803
Las hipótesis se prueban siguiendo camino paramétrico o NO paramétrico.
#Tipo 1: Decidiendo si es no no paramétrico
Probemos normalidad de la variable, ¿que significa eso?
La curva normal es una distribución estadística importante:
Cuando los datos que tienes tienen una distribución parecida a esa curva, se puede aplicar un tipo de técnicas conocidas como las paramétricas.
Esta gráfica compara el histograma de las notas de matematica, y muestra la curva normal:
library(ggplot2)
ggplot(hsb,aes(x=MATH)) + geom_histogram(aes(y = ..density..),bins = 20, fill='green') +
stat_function(fun = dnorm, colour = "red",
args = list(mean = mean(hsb$MATH, na.rm = TRUE),
sd = sd(hsb$MATH, na.rm = TRUE))) + facet_grid(~SEX) + coord_flip()
Otra alternativa gráfica es:
library(ggpubr)
## Loading required package: magrittr
ggqqplot(data=hsb,x="MATH") + facet_grid(. ~ SEX)
Si los puntos se alejan mucho de la diagonal, se aleja de la normalidad.
Como es dificil hacerlo visualmente siempre, podemos usar el test de Shapiro-Wilk, que nos reporta la probabilidad que los datos tengan esa distribución.
normalidadTest=function(x) {y =shapiro.test(x);
c(y$statistic, y$p.value)}
resultado= aggregate(f1, hsb,
FUN = normalidadTest)
library(knitr)
shapiroTest=as.data.frame(resultado[,2])
names(shapiroTest)=c("SW_Statistic","Probabilidad")
kable(cbind(resultado[1],shapiroTest))
| SEX | SW_Statistic | Probabilidad |
|---|---|---|
| 1 | 0.9837903 | 0.0034565 |
| 2 | 0.9790040 | 0.0001031 |
Opcion Paramétrica para dicotómica: Si hay normalidad usa la prueba t:
t.test(f1,hsb)
##
## Welch Two Sample t-test
##
## data: MATH by SEX
## t = 1.1722, df = 560.59, p-value = 0.2416
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.6154067 2.4371360
## sample estimates:
## mean in group 1 mean in group 2
## 52.34542 51.43456
Esta prueba informa la probabilidad que la media de MATH sea la misma en ambos grupos de SEX.
Opcion No Paramétrica para dicotómica:
Si no hay normalidad usa la prueba Mann-Whitney:
wilcox.test(f1,hsb)
##
## Wilcoxon rank sum test with continuity correction
##
## data: MATH by SEX
## W = 46789, p-value = 0.3086
## alternative hypothesis: true location shift is not equal to 0
Verificando para tipo 2: Queremos saber si hay normalidad de la numerica en cada grupo de la categorica:
resultado= aggregate(f2, hsb,
FUN = normalidadTest)
library(knitr)
shapiroTest=as.data.frame(resultado[,2])
names(shapiroTest)=c("SW_Statistic","Probabilidad")
kable(cbind(resultado[1],shapiroTest))
| HSP | SW_Statistic | Probabilidad |
|---|---|---|
| 1 | 0.9888836 | 0.0187048 |
| 2 | 0.9810514 | 0.0423975 |
| 3 | 0.9512192 | 0.0000496 |
Como al menos una tiene probabilidad menor a 0.05, debemos ir por el camino no paramétrico.
Opcion Paramétrica para politomica:
summary(aov(f2, data=hsb))
## Df Sum Sq Mean Sq F value Pr(>F)
## HSP 2 10515 5258 73.72 <2e-16 ***
## Residuals 597 42579 71
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Los astericos indican que la probabilidad de que todas las medias sean iguales es menor a 0.05. De ahi que al menos una difiere de las demás. Tratemos de detectar las diferencias:
library(ggpubr)
ggerrorplot(hsb, x = "HSP",
y = "MATH",
desc_stat = "mean_ci"
)
El nivel 1 se diferenciaría de los demás.
Opcion No Paramétrica para politomica: Aquí puedes usar la prueba de Kruskal-Wallis:
kruskal.test(f2,hsb)
##
## Kruskal-Wallis rank sum test
##
## data: MATH by HSP
## Kruskal-Wallis chi-squared = 121.26, df = 2, p-value < 2.2e-16
Aqui no muestra asteriscos, pero la probabilidad (p-value) es también menor a 0.05.
Visualmente:
ggplot(data=hsb, aes(x=HSP, y=MATH)) + geom_boxplot(notch = T)
En este caso, se ha puesto un ‘notch’ al boxplot. Si los notches se intersectan, se asume igualdad de medianas, de ahí que la opcion 1 es diferente a las demás.