Curso de R:

Capitulo 7: Regresión Lineal.

En este capítulo vamos a ver como realiza el análisis de regresión R. Los modelos de regresión lineal son modelos probabilísticos basados en una función lineal, expresamos una variable en función otro conjunto de variables. Los pasos básicos a seguir en el estudio de un modelo lineal son:

  1. Escribir el modelo matemático con todas sus hipótesis.

  2. Estimación de los parámetros del modelo.

  3. Inferencias sobre los parámetros.

  4. Diagnóstico del modelo.

No nos vamos a detener en todos los pasos puesto que si lo hiciéramos el capítulo quedaría demasiado extenso. Vamos a analizar las posibilidades que tenemos con R y para que nos pueden servir los modelos lineales.

La función que realiza los modelos lineales en R es lm "lineal model". Pero esta función no nos ofrece ninguna salida por pantalla si no que nos crea un objeto, o mejor dicho, nosotros creamos un objeto que va a ser un modelo de regresión lineal. Este objeto puede ser referenciado por cualquier función para realizar un análisis de la varianza, un modelo autoregresivo,... La función lm tiene la siguiente sintaxis:

lm(formula, data, subset, weights, 
        method = "qr", model = TRUE, x = FALSE, y = FALSE, qr = TRUE,
        contrasts = NULL, ...)

En formula ponemos el modelo expresado: y ~ x1+x2+...+xn

En data especificamos el data frame que contiene las variables del modelo en el caso de que trabajemos con un data frame.

En subset especificamos un subconjunto de observaciones para validar posteriormente el modelo.

En weights especificamos los pesos, útil si hacemos mínimos cuadrados ponderados.

Con method especificamos el método. No entramos puesto que con el módulo base sólo es posible obtener el modelo por mínimos cuadrados.

En model con TRUE decimos a R que ha de guardarse en el objeto, la matriz del modelo, la frame,...

En contrast podemos especificar objetos con los que realizar contrastes sobre los parámetros.

Tiene múltiples opciones, para ver cuales son podéis poner en la línea de comandos ?lm y accederéis a la ayuda de R sobre el procedimiento lm. En este caso para conocer mejor su funcionamiento vamos a ver ejemplos ya que es la forma más apropiada de ir aprendiendo:

Ejemplo 7.1:

El timepo que tarda un sistema informático en red en ejecutar una instrucción depende del número de usuarios conectados a él. Si no hay usuarios el tiempo es 0. Tenemos los siguientes datos:

Nº usuarios Tiempo de ejecución
10 1
15 1.2
20 2
20 2.1
25 2.2
30 2
30 1.9

Se pretende ajustar un modelo lineal sin término independiente, construir la tabla ANOVA y comparar el modelo con el de término independiente. Comencemos:

> tiempo<-c(1,1.2,2,2.1,2.2,2,1.9)
> usuarios<-c(10,15,20,20,25,30,30)
> ejemplo7.1<-lm(tiempo~usuarios-1)    #se crea un objeto con el modelo lineal
> summary(ejemplo7.1)                  #sumarizamos el objeto para ver el modelo
Call:
lm(formula = tiempo ~ usuarios - 1)
Residuals:
    Min      1Q  Median      3Q     Max 
-0.4831 -0.1873  0.2056  0.3127  0.5113 
Coefficients:
         Estimate Std. Error t value Pr(>|t|)    
usuarios 0.079437   0.006496   12.23 1.82e-05 ***
---
Signif. codes:  0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 
Residual standard error: 0.3871 on 6 degrees of freedom
Multiple R-Squared: 0.9614,     Adjusted R-squared: 0.955 
F-statistic: 149.5 on 1 and 6 DF,  p-value: 1.821e-05 

Los modelos se escriben de la forma dependiente~indepentiente1+independiente2+...+independienten con -1 le indicamos a R que es un modelo sin término independiente. En este caso el modelo resultante sería:  tiempo de ejecución=0.0794usuarios, también decir que es un excelente modelo lineal ya  que el Multiple R-Squared: 0.9614  (coeficiente de determinación ajustado) es bastante próximo a 1 (el mejor valor posible). Para construir la tabla del análisis de la varianza hemos de emplear la instrucción anova(objeto). El objeto lógicamente va a ser nuestro modelo lineal:

> anova(ejemplo7.1)
Analysis of Variance Table
Response: tiempo
          Df  Sum Sq Mean Sq F value    Pr(>F)    
usuarios   1 22.4011 22.4011  149.53 1.821e-05 ***
Residuals  6  0.8989  0.1498                      
---
Signif. codes:  0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Ejemplo 7.2:

Nos han enviado por correo electrónico un archivo de texto que contiene las notas de la asignatura de estadística de un centro universitario. Nos piden que hagamos un modelo para predecir las notas finales a partir de las notas de los exámenes previos, el test y la puntuación del laboratorio. Pincha aquí para ver el archivo. La descripción del archivo viene recogida en la siguiente tabla:

Variable

Tipo

Columnas

Descripción añadida

ID del estudiante

alfanumérico

1-3

 

genero

alfanumérico

5

f=emenino  m=masculino

clase

numérico

7

2=alevín    3=junior    4=senior

puntuación de test

numérico

9-10

puntos máximos = 50

puntuación del examen 1

numérico

12-14

puntos máximos = 100

puntuación del examen 2

numérico

16-18

puntos máximos = 100

puntuación de laboratorio

numérico

20-22

puntos máximos = 100

puntuación del examen final

numérico

25-27

puntos máximos = 200

Comencemos a trabajar con R:

> archivo<-read.table("c:\\datos\\GRADES.TXT") #leemos el archivo
> nombres<-c("ID","sexo","clase","test","exam1","exam2","labo","final")
> names(archivo)<-nombres  #nombramos las variables
> ejemplo7.2<-lm(final~test+exam1+exam2+labo,data=archivo)  #hacemos el modelo
> summary(ejemplo7.2)    #sumarizamos
Call:
lm(formula = final ~ test + exam1 + exam2 + labo, data = archivo)
Residuals:
     Min       1Q   Median       3Q      Max 
-75.5711 -10.5697   0.7903  15.8257  32.6372 
Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept) -17.8277    50.2996  -0.354  0.72471   
test          0.8606     0.7650   1.125  0.26672   
exam1         0.6709     0.2413   2.781  0.00795 **
exam2         0.4316     0.3667   1.177  0.24547   
labo          0.2924     0.6182   0.473  0.63855   
---
Signif. codes:  0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 
Residual standard error: 21.06 on 44 degrees of freedom
Multiple R-Squared: 0.4716,     Adjusted R-squared: 0.4236 
F-statistic: 9.818 on 4 and 44 DF,  p-value: 9.142e-06 

He aquí el modelo resultante del que como podemos ver sólo nos quedaríamos con la variable exam1 ya que los contrastes para las restantes estimaciones de parámetros no se rechaza la hipótesis de partida de nulidad del parámetro. Quizá estemos ante un problema de multicolinealidad ya que habrá una alta dependencia lineal entre las variables regresoras. Para ver la dependencia lineal hemos de ver el coeficiente de correlación, la forma en que se haya la matriz de correlaciones es la siguiente:

> co1<-cor(archivo$test,archivo$exam1)
> co2<-cor(archivo$test,archivo$exam2)
> co3<-cor(archivo$test,archivo$labo)
> co4<-cor(archivo$exam1,archivo$exam2)
> co5<-cor(archivo$exam1,archivo$labo)
> co6<-cor(archivo$exam2,archivo$labo)

 La forma no es muy ortodoxa, pero no se me ocurre otra forma mejor de hacerlo, como vemos creamos objetos que contienen los coeficientes de correlación se crean con la función cor. Los listamos y construimos la matriz de correlaciones con nuestros medios o con la función matix. Yo lo hago manualmente y la matriz queda:

  test exam1 exam2 labo
test   0.53 0.48 0.60
exam1     0.52 0.033
exam2       0.23
labo        

No están todas altamente correladas, debe de existir alguna combinación lineal de algunas de ellas pero a simple vista no se detecta. Habríamos de buscar un modo de ver como se "infla" la varianza si quitamos alguna variable regresora. De momento no sé el modo de hacerlo con R pero espero poder solventarlo pronto. También desconozco como seleccionar el modelo de regresión más adecuado. En cuanto al análisis de residuos me lo reservo para un posterior capítulo porque sería interesante conocer algunas posibilidades gráficas que tiene R.

Volver a la página principal.

Menú del curso

Capítulo 8: Más ejemplos de regresión.

 

1