modelo.jerarquico.fnc

Copia, Pega y Adapta

modelo.jerarquico.fnc(alumnos, vd = 'MathAch', grafica=T,

variables='c.SES', fac.random='c.SES', random='School')

variables=c('MEANSES*c.SES','Sector*c.SES')

modelo.jerarquico.fnc(alumnos, vd = 'MathAch', grafica=T,

variables=variables, fac.random='c.SES', random='School')

Objetivo

Estima facilmente modelos jerárquicos multinivel. En estos modelos se asume la existencia de una jerarquía en los datos. El ejemplo más común en la literatura asume dos niveles jerárquicos: primer nivel jerárquico alumnos y segundo nivel escuelas. En su modelo mas simple se asume que la media global de la variable criterio (Intercepto) es diferente en cada colegio (segundo nivel jerárquico). Al descomponer la varianza total de la variable criterio en los dos niveles jerárquicos el usuario puede estudiar y tratar de explicar ambas fuentes de varianza incluyendo variables pertenecientes a ambos niveles (variables de los alumnos y de los colegios) así como su efecto de interacción cruzada.

Modelo de regresión multinivel

Partiremos de las conocidas bases de datos de alumnos y colegios de Brik y Raudenbush(1992) (Extraido de la página de J.Fox apéndice de R compainon to applied regression) La base de datos alumnos contiene los valores de 7165 niños en 160 colegios diferentes. La base de datos colegios contiene por otra parte 6 variables características de cada uno de los 160 colegios. Debemos por tanto fundir ambas bases de datos, lo cual haremos con la función fundir.objetos.fnc.

colegios= lee.archivo.fnc('jerarquico.colegios.Rdata')

alumnos= lee.archivo.fnc('jerarquico.alumnos.Rdata')

head(alumnos)

School Minority Sex SES MathAch MEANSES

1 1224 No Female -1.528 5.876 -0.428

2 1224 No Female -0.588 19.708 -0.428

3 1224 No Male -0.528 20.349 -0.428

4 1224 No Male -0.668 8.781 -0.428

5 1224 No Male -0.158 17.898 -0.428

6 1224 No Male 0.022 4.583 -0.428

head(colegios)

School Size Sector PRACAD DISCLIM HIMINTY

1224 1224 842 Public 0.35 1.597 0

1288 1288 1855 Public 0.27 0.174 0

1296 1296 1719 Public 0.32 -0.137 1

1308 1308 716 Catholic 0.96 -0.622 0

1317 1317 455 Catholic 0.95 -1.694 1

1358 1358 1430 Public 0.25 1.535 0

Fundimos ambas bases de datos, con School como variable de emparejamiento de ambas bases de datos (que.var='School')

alumnos=fundir.objetos.fnc(alumnos,colegios, mas.var=T,

que.var='School')

#------------------------------------------------------------------

# FUNDIDO DE ARCHIVOS. ADD VARIABLES

#------------------------------------------------------------------

*** WARNING. Tu unidad de registro: School

en la la primera base de datos ocupa mas de una fila.

*** Dimensiones de entrada y salida ***

dim.datos1 dim.datos2 dim.combinados

filas 7185 160 7185

columnas 6 6 11

Una cuestión de especial relevancia tiene que ver con la naturaleza de la variable que define el segundo nivel jerárquico (School en este ejemplo). Es importante sobre todo a la hora de solicitar gráficos exploratorios que dicha variable sea categórica o factor. Esto lo conseguiremos facilmente transformando dicha variable mediante transforma.variable.fnc.

alumnos= transforma.variable.fnc(alumnos, variable='School',

nuevo.tipo='factor')

*** Se ha transformado la variable: School desde su version ordered factor a su version: factor ***

Queremos modelar el rendimiento en matemáticas de los alumnos (MathAch) a partir de variables características de los alumnos y los colegios. Tenemos dos tipos de colegios recogidos en la variable Sector (públicos y católicos) y deseamos en primer lugar valorar la importancia que el nivel socioeconómico tiene sobre el rendimiento en matemáticas para ambos tipos de colegios.

Valoraremos en primer lugar un supuesto de extraordinaria importancia en los modelos lineales y en especial en los jerárquicos. Hablamos de la necesaria relación lineal que debe existir entre la variable criterio a modelar y las predictoras. Para ello solicitaremos un gráfico de panel que nos permita ver dicha relación para ambos tipos de colegios (incluyendo la variable Sector en el argumento x.panel).

grafica.panel.fnc(alumnos,vd='MathAch',

que.factor='SES',

x.panel='Sector',

regresion=T)

Vemos que la pendiente de regresión es mas acusada en los colegios de caracter público que en los católicos. Es el momento de plantearnos si esta pendiente pudiera tener un caracter aleatorio (random) a través del las escuelas (segundo nivel jerárquico), o lo que es lo mismo si el efecto del nivel socioeconómico sobre el rendimiento en matemáticas es diferente en cada escuela. Dado que tenemos una gran cantidad de colegios, no tiene sentido solicitar una gráfica de panel genere tantas subgráficas como colegios haya. Resulta altamente conveniente extraer una muestra aleatoria de 20 colegios de ambos tipos de la variable Sector. Utilizaremos para este objetivo la función extrae.muestra.fnc.

muestra = extrae.muestra.fnc(alumnos, que.factor='Sector',

n=20, ID='School')

#------------------------------------------------------------------

# EXTRACCION DE MUESTRA ALEATORIA

#------------------------------------------------------------------

*** Se ha extraido una muestra de 20 registros por cada nivel de Sector ***

Por conveniencia, seguidamente crearemos una lista donde separaremos los colegios públicos y católicos utilizando divide.por.factor.fnc.

x.sector=divide.por.factor.fnc(muestra,

que.factor='Sector')

#------------------------------------------------------------------

# DIVIDE LA BASE DE DATOS POR FACTOR

#------------------------------------------------------------------

*** Se ha creado una lista con 2 elementos, correspondientes a los niveles del factor Sector

*** Estos son los elementos de esa lista: Public Catholic

*** Si deseas acceder a uno de ellos indicalo mediante: nombre.de.la.lista$que.lista

*** donde que.lista se refiere al elemento que deseas extraer.

Ahora podemos solicitar dos gráficos de panel (uno para cada tipo de colegio) donde podamos valorar la pendiente de regresión del rendimiento en matemáticas de los alumnos sobre el nivel socioeconómico de los mismos. A diferencia de la gráfica anterior el argumento x.panel ahora tiene como valor la variable School. Es decir habrá 20 subgráficas o paneles (1 por colegio).

grafica.panel.fnc(x.sector$Public,vd='MathAch',

que.factor='SES',

x.panel='School',

regresion=T,

titulo='Publicos')

grafica.panel.fnc(x.sector$Catholic,vd='MathAch',

que.factor='SES',

x.panel='School',

regresion=T,

titulo='Privados')

Tal y como habíamos constatado anteriormente, parece que la pendiente de regresión es mayor en los colegios públicos que en los privados (católicos). Es decir parece que en los primeros el rendimiento en matemáticas está mas vinculado al nivel socioeconómico de los alumnos que en los segundos.

Seguidamente nos plantearemos un modelo jerárquico multinivel donde el primer nivel jerárquico serían los alumnos y el segundo los colegios a los que estos alumnos asisten.

En primer lugar debemos centrar la variable nivel socioconómico SES. Recuerda que en todo modelo de regresión el intercepto es el valor que adopta la variable criterio y cuando la predictora x vale 0. Debemos por tanto hacer que el modelo de regresión a estimar pase por cero introduciendo la variable nivel socioeconómico centrada (puntuaciones diferenciales). El centrado puede realizarse por la media global (gran media) o por la media de cada colegio.

Centrado por la media de grupo (Group mean centering)

alumnos=centra.variable.fnc(alumnos, variable='SES', que.factor='School')

Centrado por la gran media (Grand mean centering)

alumnos= centra.variable.fnc(alumnos, variable='SES')

Utilizaremos el centrado por la gran media porque el intercepto puede entonces ser interpretado como el valor de rendimiento ajustado por la media global.

#------------------------------------------------------------------

# CENTRADO DE VARIABLE

#------------------------------------------------------------------

*** Se ha centrado con exito la variable SES .El centrado

*** se ha realizado sobre la gran media. Si deseas un centrado

*** en cada nivel de un determinado factor, incluye el argumento

*** que.factor. Ej: que.factor='School'

Para estimar el modelo utilizaremos la función modelo.jerarquico.fnc.

modelo.jerarquico.fnc(alumnos, vd = 'MathAch',

variables='c.SES',

fac.random='c.SES',

random='School',

grafica=T)

Sobre la base de datos alumnos, queremos estimar un modelo jerárquico multinivel con la variable MathAch como variable dependiente y la variable c.SES como independiente. Esta variable la asumimos con pendiente aleatoria en el segundo nivel jerárquico (una pendiente diferente por colegio) al incluirla dentro del argumento fac.random. El segundo nivel jerárquico (obligatorio) está definido en la variable School definido en el argumento obligatorio random.

Un supuesto muy importante de los modelos multinivel tiene que ver con la distribución normal de los factores aleatorios. En este caso podemos ver en el QQplot de los valores aleatorios estimados para el intercepto y la pendiente de regresión se encuentran dentro del intervalo de confianza para dicha normalidad.

res.modelo.jerarquico.multinivel

Tenemos una intraclass de 0.18, o lo que es lo mismo el 18% de la varianza del rendimiento en matemáticas está explicado por el nivel jerárquico superior (colegio). Hemos establecido el nivel socioeconómico (c.SES) con pendiente desigual por colegio. La gráfica nos muestra un patrón aparentemente aleatorio entre los valores random de intercepto y pendiente de SES. Repetiremos la llamada a la función incluyendo el argumento cualitativa donde incluiremos la variable Sector que como recordarás separaba a los colegios públicos de los católicos.

modelo.jerarquico.fnc(alumnos, vd ='MathAch',

variables='c.SES',

fac.random='c.SES',

random='School',

grafica=T,

cualitativa='Sector')

La estimación de este modelo da lugar al mismo resultado presentado anteriormente. Ahora se genera la misma gráfica anterior solo que cada punto aparecerá marcada según pertenezca al sector privado o católico.

Tal y como podemos ver el cuadrante superior izquierdo, se caracteriza por contener a los colegios con alto nivel en matemáticas (valor elevado del intercepto) pero bajo nivel socioeconómico. Es decir esas escuelas realizan un trabajo especial para conseguir que el nivel socioeconómico del niño tenga el menor impacto posible sobre su rendimiento en matemáticas. Estas escuelas vemos que son precisamente las pertenecientes al sector católico.

Elevar una variable de primer nivel al segundo nivel jerárquico

La variable MEANSES (media de nivel socioeconómico de cada colegio) es erronea porque está calculada a partir de muchos mas alumnos de los que en realidad hay en la base de datos disponible. Seguidamente expondremos el procedimiento para hacer que una variable numérica de primer nivel pase a ser de segundo nivel. Es decir queremos calcular la media de nivel socioeconómico (SES) en cada colegio y esta nueva variable repetirá su valor para cada niño que pertenezca al mismo colegio (misma unidad jerárquica de segundo nivel).

Los pasos para conseguirlo son dos: primero debemos agregar los datos (media de cada colegio en SES) y posteriormente fundir la base de datos agregada con la base de datos general de alumnos.

ses.x.school=agrega.los.datos.fnc(alumnos, vd='SES', que.factor='School')

*** Esta es la cabecera de tus datos agregados con el estadistico media ***

School SES

1 8367 0.02557143

2 8854 -0.75675000

3 4458 -1.04945833

4 5762 -1.19394595

5 6990 -0.48969811

6 5815 -0.68000000

Podemos ver que ahora tenemos una nueva base de datos (agregada) donde en cada fila tenemos a cada una de las escuelas y la media de nivel socioeconómico de cada una. Observa que la variable que contiene la media se llama lógicamente SES. Si queremos fundir esta base de datos agregada con la general de alumnos, debesmos obviamente cambiarle el nombre a esa variables.

ses.x.school= cambia.nombre.var.fnc(ses.x.school, 'SES','SES.School')

#------------------------------------------------------------------

# RENOMBRA VARIABLES

#------------------------------------------------------------------

*** Se ha cambiado el nombre de las variables SES

*** a los nuevos nombres: SES.School

School SES.School

1 8367 0.02557143

2 8854 -0.75675000

3 4458 -1.04945833

4 5762 -1.19394595

5 6990 -0.48969811

6 5815 -0.68000000

Ya podemos fundir ambas bases de datos con fundir.objetos.fnc

alumnos=fundir.objetos.fnc(alumnos, ses.x.school, mas.var=T, que.var='School')

head(alumnos)

School Minority Sex SES MathAch MEANSES Size Sector PRACAD DISCLIM

1 1224 No Female -1.528 5.876 -0.428 842 Public 0.35 1.597

2 1224 No Male -0.458 21.521 -0.428 842 Public 0.35 1.597

3 1224 No Female -1.448 9.475 -0.428 842 Public 0.35 1.597

4 1224 No Female -0.658 16.057 -0.428 842 Public 0.35 1.597

5 1224 No Male -0.468 21.178 -0.428 842 Public 0.35 1.597

6 1224 No Female -0.988 20.178 -0.428 842 Public 0.35 1.597

HIMINTY c.SES SES.School

1 0 -1.09361702 -0.434383

2 0 -0.02361702 -0.434383

3 0 -1.01361702 -0.434383

4 0 -0.22361702 -0.434383

5 0 -0.03361702 -0.434383

6 0 -0.55361702 -0.434383

Ahora la variable SES.School podemos ver que repite su valor para todos los niños pertenecientes al mismo colegio. Es decir hemos elevado de nivel jerárquico a la variable nivel socioeconómico del niño (SES) a nivel socioeconómico de la escuela en la que está el niño (SES.School). Obviamente esta nueva variable va a explicar varianza entre escuelas y no varianza intra niño.