Considere los datos hbsdemo, tomando a prog como variable dependiente y gender, ses y schtyp como variables independientes. Repita todos los análisis realizados en este documento.
Considere los datos hbsdemo, tomando a prog como variable dependiente y gender, ses y honors como variables independientes. Repita todos los análisis realizados en este documento.
Considere los datos hbsdemo, tomando a prog como variable dependiente y gender, ses y awards como variables independientes. Repita todos los análisis realizados en este documento.
2 Dataset
Code
library(repmis) # Permite importar archivos desde internet, como Rdata o .csvsource_data("https://github.com/hllinas/DatosPublicos/blob/main/hsbdemo.Rdata?raw=TRUE")
[1] "hsbdemo"
Code
#source_data del paquete repmis, que Descarga y carga directamente un archivo .Rdata desde una URL.Datos <- hsbdemoattach(Datos)
3 Variables
Code
library(knitr)library(kableExtra)library(dplyr)nombres <-names(Datos) # variables en el orden del datasetenumerados <-paste(seq_along(nombres), nombres)mitad <-ceiling(length(enumerados) /2)col1 <- enumerados[1:mitad]col2 <- enumerados[(mitad +1):length(enumerados)]if (length(col2) <length(col1)) { col2 <-c(col2, rep("", length(col1) -length(col2)))}tabla <-data.frame(col1, col2)kbl(tabla, col.names =c("", "")) %>%add_header_above(c("Nombre de las Variables"=2), bold =TRUE) %>%kable_classic(full_width =FALSE, html_font ="Arial") %>%column_spec(1, extra_css ="text-align: center;") %>%column_spec(2, extra_css ="text-align: center;") %>%row_spec(0, bold =TRUE, background ="#D3D3D3")
Nombre de las Variables
1 Student
10 science
2 id
11 socst
3 gender
12 honors
4 ses
13 awards
5 schtyp
14 cid
6 prog
15 prog0
7 read
16 prog1
8 write
17 prog2
9 math
4 Summary
Code
summary(Datos)
Student id gender ses
Min. : 1.00 Min. : 1.00 Length:200 Length:200
1st Qu.: 50.75 1st Qu.: 50.75 Class :character Class :character
Median :100.50 Median :100.50 Mode :character Mode :character
Mean :100.50 Mean :100.50
3rd Qu.:150.25 3rd Qu.:150.25
Max. :200.00 Max. :200.00
schtyp prog read write
Length:200 Length:200 Min. :28.00 Min. :31.00
Class :character Class :character 1st Qu.:44.00 1st Qu.:45.75
Mode :character Mode :character Median :50.00 Median :54.00
Mean :52.23 Mean :52.77
3rd Qu.:60.00 3rd Qu.:60.00
Max. :76.00 Max. :67.00
math science socst honors
Min. :33.00 Min. :26.00 Min. :26.0 Length:200
1st Qu.:45.00 1st Qu.:44.00 1st Qu.:46.0 Class :character
Median :52.00 Median :53.00 Median :52.0 Mode :character
Mean :52.65 Mean :51.85 Mean :52.4
3rd Qu.:59.00 3rd Qu.:58.00 3rd Qu.:61.0
Max. :75.00 Max. :74.00 Max. :71.0
awards cid prog0 prog1 prog2
Min. :0.00 Min. : 1.00 Min. :0.000 Min. :0.00 Min. :0.000
1st Qu.:0.00 1st Qu.: 5.00 1st Qu.:0.000 1st Qu.:0.00 1st Qu.:0.000
Median :1.00 Median :10.50 Median :0.000 Median :0.00 Median :1.000
Mean :1.67 Mean :10.43 Mean :0.225 Mean :0.25 Mean :0.525
3rd Qu.:2.00 3rd Qu.:15.00 3rd Qu.:0.000 3rd Qu.:0.25 3rd Qu.:1.000
Max. :7.00 Max. :20.00 Max. :1.000 Max. :1.00 Max. :1.000
5 Modelo Logit.
5.1 Pregunta 18
Considere los datos hbsdemo, tomando a prog como variable dependiente y gender, ses, honors como variables independientes. Repita todos los análisis realizados en este documento.
Escriba, matemáticamente, el vector de parámetros logísticos y el de sus estimadores.
Escriba, matemáticamente, ¿Cuál es la probabilidad estimada de que un individuo pertenezca a un tipo de programa educativo específico (digamos, “vocational”, “academic”, “general”) dado su género, nivel socioeconómico y tipo de escuela (private, public).
Escriba, matemáticamente, el modelo logístico estimado.
Obtenga las estimaciones \(\hat{\delta}\) y \(\hat{\beta}\) de los parámetros logísticos \(\delta\) y \(\beta\) utilizando la función summary :: multinom :: nnet.
Obtenga las estimaciones \(\hat{\delta}\) y \(\hat{\beta}\) de los parámetros logísticos \(\delta\) y \(\beta\) utilizando la función summary :: vglm :: VGAM.
Utilizando las estimaciones halladas en los incisos (d) o (e), escriba en el modelo correspondiente.
Haga la gráfica del riesgo versus gender, cuando ses=low. ¿Es directa o indirecta esta relación?
Halle las razones odds correspondientes.
Calcular las probabilidades predichas para cada uno de los niveles de la variable de respuesta.
Mantener fija la variable prog en su media y examinar las probabilidades predichas para cada nivel de ses.
Examinar los cambios en la probabilidad predicha asociados con cada nivel de ses, manteniendo gender fija en su media.
Examinar las probabilidades predichas promediadas para diferentes valores de la variable predictora continua gender dentro de cada nivel de honors.
Usar las predicciones que se generó en el inciso anterior y grafique las probabilidades predichas contra la puntuación de gender, para cada nivel de ses y para diferentes niveles de la variable de respuesta.
Halle los errores estándares estimados de los estimadores de los parámetros logísticos, utilizando la función multinom::nnet.
Halle los errores estándares estimados de los estimadores de los parámetros logísticos, utilizando la función vglm::VGAM.
Calcule \(\mathcal{L}(\hat{\alpha})\), la estimación del logaritmo de la función de máxima verosimilitud en el modelo logístico.
Organizando las Variables en Tablas de Mapeo de Variablesx
Mapeo de Inscripción en Gender
Variable
female
male
gender
1
0
0
1
Mapeo de Inscripción en Honors
Variable
Enrolled
Not.Enrolled
Honors
0
1
1
0
Mapeo de Variable SES
Variable
high
low
middle
ses
0
0
0
0
1
0
0
0
1
Mapeo de Tipo de Programa
Variable
academic
general
vocation
prog
0
0
0
0
1
0
0
0
1
5.1.1 solución parte a)
Escriba, matemáticamente, el vector de parámetros logísticos y el de sus estimadores. :::
Los vectores de parámetros:
\[
\boldsymbol{\alpha} = \underbrace{(\delta_0, \beta_{0ses=low}, \beta_{0ses=middle},\beta_{0gender=male}, \beta_{0honors=notenrolled}}_{\text{Primer conjunto de parámetros}}, \underbrace{\delta_1, \beta_{1ses=low}, \beta_{1ses=middle},\beta_{1gender=male}, \beta_{1honors=noenrolled})^T}_{\text{Segundo conjunto de parámetros}}
\]
y sus estimadores:
\[
\hat{\boldsymbol{\alpha}} = \underbrace{(\hat{\delta_0}, \hat{\beta}_{0ses=low}, \hat{\beta}_{0ses=middle},\hat{\beta}_{0gender=male}, \hat{\beta}_{0honors=enrolled}}_{\text{Primer conjunto de parámetros estimados}}, \underbrace{\hat{\delta_1}, \hat{\beta}_{1ses=low}, \hat{\beta}_{1ses=middle},\hat{\beta}_{1gender=male}, \hat{\beta}_{1honors=enrolled})^T}_{\text{Segundo conjunto de parámetros estimados}}
\]
5.1.2 solución parte b)
Escriba, matemáticamente, ¿Cuál es la probabilidad estimada de que un individuo pertenezca a un tipo de programa educativo específico (digamos, “vocational”, “academic”, “general”) dado su género, nivel socioeconómico y tipo de escuela (private, public)?.
Las variables independientes que usamos para predecir el programa educativo son ses, gender, honors, schtyp.
ses =\(s_j\): Esto indica el nivel socioeconómico del individuo \(j\). \(s_j\) tomará uno de los valores categóricos definidos para ses (e.g., “low”, “middle”, “high”).
gender =\(g_j\): Esto indica el género del individuo \(j\). \(g_j\) tomará uno de los valores categóricos definidos para gender (e.g., “male”, “female”).
honors =\(hr_j\): Esto indica si el individuo \(j\) ha sido inscrito en honores. \(h_j\) tomará uno de los valores categóricos definidos para honors (e.g., “no”, “yes”).
schtyp =\(sch_j\): Esto indica el tipo de escuela del individuo \(j\). Es una variable categórica con dos niveles (e.g., “private”, “public”)
La Probabilidad de Pertenecer a una Categoría Específica
La probabilidad de que un individuo pertenezca a un programa educativo específico \(r\), dadas sus características (\(ses_j\), \(gender_j\), \(honors_j\)\(schtyp\)), se puede expresar formalmente como:
5.1.3 solución parte c)
Escriba, matemáticamente, el modelo logístico estimado.
Obtenga las estimaciones \(\hat{\delta}\) y \(\hat{\beta}\) de los parámetros logísticos \(\delta\) y \(\beta\) utilizando la función summary :: multinom :: nnet.
Obtenga las estimaciones \(\hat{\delta}\) y \(\hat{\beta}\) de los parámetros logísticos \(\delta\) y \(\beta\) utilizando la función summary :: vglm :: VGAM.
donde \(s_j\) es un posible valor de la variable \(\text{ses}\), \(g_j\) es un posible valor de la variable \(\text{gender}\) y \(hr_j\) es un posiblevalor de la variable \(\text{honors}\). Sabemos que \(\hat{p}_{r_j}\) es como en el inciso anterior, el modelo estimado se puede escribir utilizando la ecuación (7.1) o la (8.1):
Haga la gráfica del riesgo versus gender, cuando ses=low. ¿Es directa o indirecta esta relación? :::
Code
library(nnet)library(ggplot2)# Ajuste del modelo multinomialprog <-relevel(as.factor(prog), ref ="academic") # Relevel para tener "academic" como referenciamodelo <-multinom(prog ~ ses + gender + honors, data = Datos) # Ajuste del modelo
# weights: 18 (10 variable)
initial value 219.722458
iter 10 value 190.375915
final value 190.249312
converged
Code
s <-summary(modelo)# Crear un conjunto de datos para realizar prediccionesgender_values <-c("male", "female") # Valores para genderhonors_values <-c("not enrolled", "enrolled") # Valores para honorsses_values <-c("low", "middle", "high") # Posibles valores para ses# Inicialización de los resultados de las probabilidadesprobabilidades <-data.frame(gender =character(0), honors =character(0), ses =character(0), p_0 =numeric(0), p_1 =numeric(0), p_2 =numeric(0))# Predecir para cada combinación de gender, honors y sesfor (g in gender_values) {for (s_type in honors_values) {for (ses_value in ses_values) { # Loop adicional para ses# Codificar el valor de ses_value como un factor ses_factor <-factor(ses_value, levels =c("low", "middle", "high"))# Cálculos para las predicciones g_0 <- s$coefficients[1, 1] + s$coefficients[1, 2] * (ses_value =="low") + s$coefficients[1, 3] * (ses_value =="middle") + s$coefficients[1, 4] * (g =="male") + s$coefficients[1, 5] * (s_type =="enrolled") g_1 <- s$coefficients[2, 1] + s$coefficients[2, 2] * (ses_value =="low") + s$coefficients[2, 3] * (ses_value =="middle") + s$coefficients[2, 4] * (g =="male") + s$coefficients[2, 5] * (s_type =="enrolled")# Probabilidades de pertenecer a los programas p_0 <-exp(g_0) / (1+exp(g_0) +exp(g_1)) # Probabilidad para el programa "general" p_1 <-exp(g_1) / (1+exp(g_0) +exp(g_1)) # Probabilidad para el programa "vocational" p_2 <-1- (p_0 + p_1) # Probabilidad para el programa "academic"# Guardar los resultados en el data frame probabilidades <-rbind(probabilidades, data.frame(gender = g, honors = s_type, ses = ses_value, p_0 = p_0, p_1 = p_1, p_2 = p_2)) } }}# Graficar los resultadosggplot(probabilidades) +geom_point(mapping =aes(x = ses, y = p_0, color ="p_0"), size =1.5) +geom_point(mapping =aes(x = ses, y = p_1, color ="p_1"), size =1.5) +geom_point(mapping =aes(x = ses, y = p_2, color ="p_2"), size =1.5) +labs(x ="Nivel Socioeconómico (ses)", y ="Probabilidad de exito") +facet_wrap(gender ~ honors + ses) +# Facet por gender, honors y sestheme_bw(base_size =12) +scale_color_discrete(name ="Tipo de programa", labels =c("(a) General", "(b) Vocational", "(c) Academic"))
Análisis de la gráfica
Estructura general de la gráfica
La gráfica está organizada en 12 paneles, cada uno representando una combinación de:
Género: female o male.
Estado de inscripción: enrolled (inscrito) o not enrolled (no inscrito).
Nivel socioeconómico (SES): high, middle, o low.
Cada panel muestra:
Eje vertical: Probabilidad de éxito.
Eje horizontal: Nivel Socioeconómico (ses).
Los puntos representan las probabilidades de éxito para tres tipos de programas:
Rojo: General
Verde: Vocacional
Azul: Académico
Variables clave
a) Género
female(mujeres)
male(hombres)
b) Estado de inscripción
enrolled: El individuo está inscrito en algún programa.
not enrolled: El individuo no está inscrito en ningún programa.
c) Nivel socioeconómico (SES)
high: Alto nivel socioeconómico.
middle: Medio nivel socioeconómico.
low: Bajo nivel socioeconómico.
d) Tipo de programa
(a) General: Representado por puntos rojos.
(b) Vocacional: Representado por puntos verdes.
(c) Académico: Representado por puntos azules.
3. Interpretación de los paneles
Cada panel representa una combinación específica de las variables mencionadas. Por ejemplo:
Panel superior izquierdo
Género: female
Estado de inscripción: enrolled
Nivel socioeconómico: high
Observaciones: - Las probabilidades de éxito varían según el tipo de programa: - Programas académicos (azul) tienen probabilidades más altas. - Programas generales (rojo) tienen probabilidades más bajas. - Para mujeres con alto SES inscritas, los programas académicos parecen ser más exitosos.
Panel inferior derecho
Género: male
Estado de inscripción: not enrolled
Nivel socioeconómico: middle
Observaciones: - Las probabilidades de éxito son más bajas en general. - Los programas académicos (azul) aún muestran mejores resultados, aunque todos los valores son bajos.
4. Tendencias globales
Al observar todos los paneles:
Inscripción vs. No inscripción
En general, las probabilidades de éxito son mayores para personas inscritas (enrolled) que para personas no inscritas (not enrolled).
Nivel socioeconómico
Las probabilidades de éxito tienden a ser más altas para personas con alto SES (high) y más bajas para personas con bajo SES (low).
Tipo de programa
Programas académicos (azul) suelen tener las mayores probabilidades de éxito.
Programas generales (rojo) tienden a tener las menores probabilidades de éxito.
Programas vocacionales (verde) están en un punto intermedio.
Diferencias por género
Aunque hay variaciones, no parece haber diferencias significativas entre hombres y mujeres en términos de probabilidad de éxito, dado que los patrones son similares en ambos casos.
5. Conclusiones principales
Factores clave para el éxito
Inscripción en programas: Ser inscrito aumenta las probabilidades de éxito.
Nivel socioeconómico: Personas con alto SES tienen mayores probabilidades de éxito.
Tipo de programa: Los programas académicos tienden a ser más exitosos que los generales o vocacionales.
Recomendaciones
Promover la inscripción en programas educativos, especialmente académicos.
Apoyar a personas con bajo SES para mejorar sus oportunidades de éxito.
Considerar estrategias específicas para programas generales y vocacionales para aumentar sus tasas de éxito.
Conclusión general:
El nivel socioeconómico (ses) tiene un gran impacto en las probabilidades de asignación a diferentes tipos de programas educativos, con los individuos de niveles socioeconómicos bajos mostrando una mayor probabilidad de estar en programas “General”.
El género también tiene una ligera influencia, pero las diferencias no son tan notorias como en el caso del nivel socioeconómico.
El tipo de escuela (not enrolled vs enrolled) parece tener una influencia moderada en las probabilidades, especialmente en el programa “Academic” (azul), donde las escuelas privadas tienden a tener mayores probabilidades de asignación.
En resumen, las variables nivel socioeconómico y tipo de escuela son las que más influyen en la asignación a los programas educativos, con el género mostrando menos variabilidad en las probabilidades de éxito para los diferentes tipos de programas.
Code
library(nnet)library(ggplot2)library(dplyr)library(tidyr)# Asegurar que todas las variables relevantes son factoresDatos <- Datos %>%mutate(across(c(prog, ses, gender, honors), as.factor))# Ajustar modelo multinomialmodelo <-multinom(prog ~ ses + gender + honors, data = Datos)
# weights: 18 (10 variable)
initial value 219.722458
iter 10 value 190.375915
final value 190.249312
converged
Code
# Crear combinaciones posiblesnuevos_datos <-expand.grid(ses =levels(Datos$ses),gender =levels(Datos$gender),honors =levels(Datos$honors))# Convertir columnas a factores con los niveles del dataset originalnuevos_datos <- nuevos_datos %>%mutate(across(everything(), ~factor(.x, levels =levels(Datos[[cur_column()]]))))# Predecir probabilidadesprobabilidades <-predict(modelo, newdata = nuevos_datos, type ="probs")# Unir predicciones con combinaciones y mantener columnas limpiasdf_probs <-bind_cols(nuevos_datos, as.data.frame(probabilidades))# Pivotear solo las columnas de las probabilidadesdf_probs_largo <- df_probs %>%pivot_longer(cols =colnames(probabilidades), # Solo columnas de predicciónnames_to ="Programa",values_to ="Probabilidad" )# Crear una etiqueta de combinación de factores para el eje Xdf_probs_largo <- df_probs_largo %>%unite("Combinacion", ses, gender, honors, sep ="_")# Graficarggplot(df_probs_largo, aes(x = Combinacion, y = Probabilidad, fill = Programa)) +geom_bar(stat ="identity", position ="dodge") +labs(x ="Combinación SES-Gender-Honors", y ="Probabilidad estimada",title ="Predicción de éxito por tipo de programa y categorías") +theme_bw(base_size =12) +theme(axis.text.x =element_text(angle =45, hjust =1))
5.1.8 solución parte h)
Halle las razones odds correspondientes.
Code
library(nnet)prog <-relevel(as.factor(prog), ref ="academic")modelo <-multinom(prog ~ ses + gender + honors, data = Datos)
# weights: 18 (10 variable)
initial value 219.722458
iter 10 value 190.375915
final value 190.249312
converged
Conclusión general: Nivel socioeconómico tiene un efecto significativo en las probabilidades de pertenecer a las categorías de programas educativos, especialmente para los niveles bajo y medio. Los individuos con un nivel socioeconómico más bajo o medio tienen una probabilidad más alta de estar en categorías no académicas, como “vocational” o “general”.
Género también juega un papel, pero el efecto no es tan pronunciado, ya que el coeficiente gendermale:1 no es muy grande, lo que sugiere que el género masculino tiene una probabilidad ligeramente mayor de estar en las categorías no académicas en comparación con las mujeres.
Tipo de escuela (pública vs. privada) también tiene un impacto significativo en las probabilidades de pertenecer a los diferentes programas. Las escuelas públicas parecen estar asociadas con una probabilidad más alta de que los individuos pertenezcan a categorías diferentes de “academic”.
En resumen, el nivel socioeconómico es el factor que parece tener el mayor impacto en la asignación a las categorías de prog, seguido por el género y el tipo de escuela.
5.1.9 solución parte i)
Calcular las probabilidades predichas para cada uno de los niveles de la variable de respuesta.
Mantener fija la variable gender en su media y examinar las probabilidades predichas para cada nivel de ses.
Code
# Codificar 'gender' como variable numéricaDatos$gender_numeric <-ifelse(Datos$gender =="female", 0, 1)# Calcular el promedio de 'gender' codificadomean_gender <-mean(Datos$gender_numeric, na.rm =TRUE)# Crear el dataframe 'Nuevo' con el promedio de 'gender' y otros valoresNuevo <-data.frame(ses =c("low", "middle", "high"),gender = mean_gender)# Ver el resultadoprint(Nuevo)
ses gender
1 low 0.455
2 middle 0.455
3 high 0.455
gender fue codificado con 0 para “female” y 1 para “male”. Un valor de 0.455 indica que, aproximadamente, el 45.5% de los individuos en cada nivel socioeconómico son hombres (gender = 1), y el 54.5% son mujeres (gender = 0).
El valor 0.455 es el promedio de las codificaciones de género para cada categoría de ses, lo que sugiere que la proporción de hombres y mujeres es bastante similar en los tres niveles socioeconómicos (low, middle, y high).
En cada nivel socioeconómico, “low”, “middle”, y “high”, la proporción de hombres y mujeres es casi igual, con un valor promedio de 0.455 para gender en todos los niveles de ses.
El promedio 0.455 es el resultado de codificar “female” como 0 y “male” como 1, y muestra una ligera inclinación hacia “female”, ya que el valor está más cerca de 0 que de 1.
5.1.11 solución parte k)
Examinar los cambios en la probabilidad predicha asociados con cada nivel de ses, manteniendo gender fija en su media.
Code
library(nnet)library(ggplot2)# Ajuste del modelo multinomialprog <-relevel(as.factor(prog), ref ="academic") # Relevel para tener "academic" como referenciamodelo <-multinom(prog ~ ses + gender + honors, data = Datos) # Ajuste del modelo
# weights: 18 (10 variable)
initial value 219.722458
iter 10 value 190.375915
final value 190.249312
converged
Code
s <-summary(modelo)# Crear un conjunto de datos para realizar prediccionesgender_values <-c("male", "female") # Valores para genderhonors_values <-c("not enrolled", "enrolled") # Valores para honorsses_values <-c("low", "middle", "high") # Posibles valores para ses# Inicialización de los resultados de las probabilidadesprobabilidades <-data.frame(gender =character(0), honors =character(0), ses =character(0), p_0 =numeric(0), p_1 =numeric(0), p_2 =numeric(0))# Predecir para cada combinación de gender, honors y sesfor (g in gender_values) {for (s_type in honors_values) {for (ses_value in ses_values) { # Loop adicional para ses# Codificar el valor de ses_value como un factor ses_factor <-factor(ses_value, levels =c("low", "middle", "high"))# Cálculos para las predicciones g_0 <- s$coefficients[1, 1] + s$coefficients[1, 2] * (ses_value =="low") + s$coefficients[1, 3] * (ses_value =="middle") + s$coefficients[1, 4] * (g =="male") + s$coefficients[1, 5] * (s_type =="enrolled") g_1 <- s$coefficients[2, 1] + s$coefficients[2, 2] * (ses_value =="low") + s$coefficients[2, 3] * (ses_value =="middle") + s$coefficients[2, 4] * (g =="male") + s$coefficients[2, 5] * (s_type =="enrolled")# Probabilidades de pertenecer a los programas p_0 <-exp(g_0) / (1+exp(g_0) +exp(g_1)) # Probabilidad para el programa "general" p_1 <-exp(g_1) / (1+exp(g_0) +exp(g_1)) # Probabilidad para el programa "vocational" p_2 <-1- (p_0 + p_1) # Probabilidad para el programa "academic"# Guardar los resultados en el data frame probabilidades <-rbind(probabilidades, data.frame(gender = g, honors = s_type, ses = ses_value, p_0 = p_0, p_1 = p_1, p_2 = p_2)) } }}predichos <-c(p_0,p_1,p_2)predichos
[1] 0.1979231 0.1722697 0.6298072
Conclusión: El modelo ha convergido correctamente y ha ajustado los coeficientes,Las probabilidades predichas para cada tipo de programa (general, vocational, academic) son: General: 15.03% Vocational: 14.01% Academic: 70.96%
Esto indica que, manteniendo gender fijo en su media, la probabilidad más alta es que el individuo pertenezca al programa “academic”.
5.1.12 solución parte l)
Examinar las probabilidades predichas promediadas para diferentes valores de la variable predictora continua gender dentro de cada nivel de honors.
# Convertir 'gender' y 'honors' a factores si no lo sonhsbdemo$gender <-factor(hsbdemo$gender, levels =c("female", "male"))hsbdemo$honors <-factor(hsbdemo$honors, levels =c("enrolled", "not enrolled"))
Code
# Paso 1: Crear el vector para 'ses' con 200 elementosses_values <-rep(c("low", "middle", "high"), length.out =200) # Esto asegura 200 elementos# Paso 2: Crear el vector para 'gender' con 200 elementos (ya lo tienes como secuencia continua o categórica)gender_values <-rep(c("male", "female"), length.out =200) # Esto asegura 200 elementos para 'gender'# Paso 3: Crear el data frame 'Nuevo' con 200 filasNuevo <-data.frame(ses = ses_values, # Valores de 'ses' con 200 elementosgender = gender_values, # Valores de 'gender' con 200 elementoshonors =rep(c("enrolled", "not enrolled"), length.out =200) # Combinación de 'enrolled' y 'not enrolled' para 200 filas)# Verifica la estructura del nuevo data frame 'Nuevo'str(Nuevo)
# Paso 1: Crear un vector para 'ses' con 200 elementos# Usamos 'length.out = 200' para asegurar que tenga exactamente 200 filasses_values <-rep(c("low", "middle", "high"), length.out =200) # Repetir 'ses' para 200 filas# Paso 2: Crear un vector para 'gender' con 200 elementos# Usamos 'length.out = 200' para asegurar que tenga exactamente 200 filasgender_values <-rep(c("male", "female"), length.out =200) # Repetir 'gender' para 200 filas# Paso 3: Crear un vector para 'honors' con 200 elementos# Usamos 'length.out = 200' para asegurar que tenga exactamente 200 filashonors_values <-rep(c("enrolled", "not enrolled"), length.out =200) # Repetir 'honors' para 200 filas# Crear el data frame 'Nuevo' con las combinaciones de 'ses', 'gender' y 'honors'Nuevo <-data.frame(ses = ses_values, # Valores de 'ses' con 200 elementosgender = gender_values, # Valores de 'gender' con 200 elementoshonors = honors_values # Valores de 'honors' con 200 elementos)# Verifica la estructura del nuevo data frame 'Nuevo'str(Nuevo)
# Paso 2: Realizar las predicciones para los nuevos datos# Realizamos las predicciones utilizando el modelo ajustadoPredichos <-cbind(Nuevo, predict(modelo, newdata = Nuevo, type ="probs"))# Ver las primeras prediccioneshead(Predichos)
Code
# Paso 3: Agrupar por 'ses' y calcular la media de las probabilidades para cada tipo de programa# Usamos dplyr para agrupar y calcular las medias de las probabilidadeslibrary(dplyr)Resumen <- Predichos %>%group_by(ses) %>%# Agrupar por 'ses' (low, middle, high)summarise(P0_general =mean(general), # Promedio de la probabilidad de "general"P1_vocation =mean(vocation), # Promedio de la probabilidad de "vocational"P2_academic =mean(academic) # Promedio de la probabilidad de "academic" )# Ver el resumen de las probabilidades predichasprint(Resumen)
# A tibble: 3 × 4
ses P0_general P1_vocation P2_academic
<chr> <dbl> <dbl> <dbl>
1 high 0.147 0.117 0.736
2 low 0.303 0.217 0.480
3 middle 0.177 0.267 0.556
El nivel socioeconómico parece tener una influencia importante en las probabilidades de que un individuo participe en programas académicos versus generales o vocacionales. Los individuos con alto nivel socioeconómico tienen una probabilidad mucho mayor de estar en un programa académico, mientras que aquellos con bajo nivel socioeconómico tienden a estar más distribuidos en programas generales o vocacionales.
Esta interpretación puede variar dependiendo de otros factores que no están reflejados en esta tabla, pero proporciona un buen punto de partida para analizar la relación entre el nivel socioeconómico y la elección del programa educativo.
5.1.13 solución parte m)
Usar las predicciones que se generó en el inciso anterior y grafique las probabilidades predichas contra la puntuación de gender, para cada nivel de ses y para diferentes niveles de la variable de respuesta.
Code
library(ggplot2)library(reshape2)# Suponiendo que 'Predichos' es tu data frame originalTabla <-melt(Predichos, id.vars =c("ses", "gender"), value.name ="probability")ggplot(Tabla, aes(x = gender, y = probability, group = ses, colour = ses)) +geom_line(size =1) +geom_point(size =3) +facet_wrap(~ variable, scales ="free_y") +theme_minimal() +labs(title ="Probabilidades por Genero y Nivel Socioeconómico",x ="Género", y ="Probabilidad", colour ="Nivel SES") +theme(strip.text =element_text(size =12, face ="bold"),axis.text =element_text(size =10),legend.position ="bottom")
Conclusión general: El nivel socioeconómico influye fuertemente en el tipo de programa educativo al que acceden los estudiantes. El género también influye, especialmente en el tipo de escuela (privada vs. pública). Las mujeres de nivel alto tienen mayores oportunidades de acceder a programas académicos, mientras que las personas de nivel bajo, sin importar el género, tienden a estar en programas generales.
5.1.14 solución parte n)
Halle los errores estándares estimados de los estimadores de los parámetros logísticos, utilizando la función multinom :: nnet.
Code
library(nnet)modelo <-multinom(prog ~ ses + gender + honors, data = hsbdemo)
# weights: 18 (10 variable)
initial value 219.722458
iter 10 value 190.375915
final value 190.249312
converged
Halle los errores estándares estimados de los estimadores de los parámetros logísticos, utilizando la función vglm :: VGAM.
Code
library(VGAM)modelo <-vglm(prog ~ ses + gender + honors, family =multinomial(refLevel =1), data = Datos)# Obtener el resumen del modelosummary_modelo <-summary(modelo)summary_modelo
Call:
vglm(formula = prog ~ ses + gender + honors, family = multinomial(refLevel = 1),
data = Datos)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept):1 -2.23736 0.52003 -4.302 1.69e-05 ***
(Intercept):2 -2.57432 0.56822 -4.530 5.89e-06 ***
seslow:1 1.23101 0.51858 2.374 0.0176 *
seslow:2 1.15210 0.56798 2.028 0.0425 *
sesmiddle:1 0.51486 0.47071 1.094 0.2740
sesmiddle:2 1.17100 0.48513 2.414 0.0158 *
gendermale:1 0.07536 0.38158 0.197 0.8434
gendermale:2 -0.04306 0.37007 -0.116 0.9074
honorsnot enrolled:1 1.07981 0.47805 2.259 0.0239 *
honorsnot enrolled:2 1.27800 0.49715 2.571 0.0102 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Names of linear predictors: log(mu[,2]/mu[,1]), log(mu[,3]/mu[,1])
Residual deviance: 380.4986 on 390 degrees of freedom
Log-likelihood: -190.2493 on 390 degrees of freedom
Number of Fisher scoring iterations: 4
No Hauck-Donner effect found in any of the estimates
Reference group is level 1 of the response
5.1.16 solución parte p)
Calcule L(α^) , la estimación del logaritmo de la función de máxima verosimilitud en el modelo logístico.
La estimación del logaritmo de la función de máxima verosimilitud en el modelo logístico se puede obtener de varias maneras. Una es reemplazando los valores correspondientes en la ecuación (8.2):
Call:
vglm(formula = prog ~ ses + gender + honors, family = multinomial(refLevel = 1),
data = Datos)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept):1 -2.23736 0.52003 -4.302 1.69e-05 ***
(Intercept):2 -2.57432 0.56822 -4.530 5.89e-06 ***
seslow:1 1.23101 0.51858 2.374 0.0176 *
seslow:2 1.15210 0.56798 2.028 0.0425 *
sesmiddle:1 0.51486 0.47071 1.094 0.2740
sesmiddle:2 1.17100 0.48513 2.414 0.0158 *
gendermale:1 0.07536 0.38158 0.197 0.8434
gendermale:2 -0.04306 0.37007 -0.116 0.9074
honorsnot enrolled:1 1.07981 0.47805 2.259 0.0239 *
honorsnot enrolled:2 1.27800 0.49715 2.571 0.0102 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Names of linear predictors: log(mu[,2]/mu[,1]), log(mu[,3]/mu[,1])
Residual deviance: 380.4986 on 390 degrees of freedom
Log-likelihood: -190.2493 on 390 degrees of freedom
Number of Fisher scoring iterations: 4
No Hauck-Donner effect found in any of the estimates
Reference group is level 1 of the response
Calcular Intervalos confianza sea\(\text{logit}(p_j)\) o esccala de probabilidad
Cálculo de la Varianza para el Estimador del Logit
La varianza de \(\text{logit}(p_j)\) se puede calcular usando la matriz de covarianzas de los coeficientes \(\hat{\beta}\). Dado que tenemos dos variables independientes, la matriz de covarianzas tendrá la forma:
Para simplificar, podemos asumir que ya tenemos la matriz de covarianzas \(\text{Cov}(\hat{\beta})\). Luego, la varianza del logit para la categoría de café (por ejemplo) se calcularía de la siguiente manera:
\(\hat{\beta_0}, \hat{\beta_1}, \hat{\beta_2}\) son los coeficientes estimados para las categorías del modelo multinomial.
\(x_1\) es el valor de la edad de la observación.
\(x_2\) es el valor del ingreso de la observación.
\(\text{Var}(\hat{\beta_1})\), \(\text{Var}(\hat{\beta_2})\), y \(\text{Cov}(\hat{\beta_1}, \hat{\beta_2})\) provienen de la matriz de covarianzas de los coeficientes estimados.
6.2 Cálculo del Intervalo de Confianza para \(\text{logit}(p_{\text{café}})\)
Una vez que tienes la varianza del logit, el intervalo de confianza para \(\text{logit}(p_{\text{café}})\) se calcula usando una distribución normal (aproximación de máxima verosimilitud) con un valor \(z\) asociado al nivel de confianza deseado (por ejemplo, \(z = 1.96\) para un intervalo de confianza del 95%).
El intervalo de confianza para \(\text{logit}(p_{\text{café}})\) es:
\[
\hat{\text{logit}}(p_{\text{café}}) \pm z \cdot \sqrt{\text{Var}(\text{logit}(p_{\text{café}}))}
\]
6.2.1 Paso a Paso:
Estimación del logit: La estimación de \(\text{logit}(p_{\text{café}})\) para un consumidor con valores conocidos de las variables independientes (edad \(x_1\) e ingresos \(x_2\)) es:
Cálculo del intervalo de confianza: Con el valor \(z = 1.96\) para un intervalo de confianza del 95%, el intervalo de confianza para \(\text{logit}(p_{\text{café}})\) es:
Transformación a la escala de probabilidad: Para obtener el intervalo de confianza para la probabilidad \(p_{\text{café}}\), debemos aplicar la función logística inversa:
OJO SE REEMPLAZA LOS VALORES DE LOS INTERVALOS EN LA FUNCION Y transformarlo a la escala de probabilidad en un modelo multinomial. lo que quiere decir va a estar entre 20% y 40%
Jesús David Zamora Thowinsson. Economista y Administrador Público, Especialista en Estadística Aplicada, Candidato a Magíster Scientiarum en Gerencia Empresarial, Magíster en Estadística Aplicada.↩︎