Professional Documents
Culture Documents
http://wpd.ugr.es/~bioestad/guia-r-studio/practica-3/#6
Objetivos
Ajustar modelos de regresión lineal simple y múltiple estimando los valores de sus
parámetros
Obtener información adicional sobre los modelos de regresión (contrastes de
significación de los parámetros, test de bondad de ajuste,…)
Contrastar las hipótesis del modelo de regresión lineal
Ajustar un modelo de regresión cuadrático
Estudiar la correlación entre variables.
Regresión
El objetivo del Análisis de regresión es determinar una función matemática
sencilla que describa el comportamiento de una variable dados los valores de
otra u otras variables. En el Análisis de regresión simple, se pretende estudiar y
explicar el comportamiento de una variable que notamos y, y que
llamaremos variable explicada, variable dependiente o variable de interés, a partir
de otra variable, que notamos x, y que llamamos variable explicativa, variable
independiente o variable de predicción. El principal objetivo de la regresión es
encontrar la función que mejor explique la relación entre la variable dependiente y
las independientes.
Para cumplir dicho objetivo, el primer paso que debe realizar el investigador, es
representar las observaciones de ambas variables en un gráfico llamado
diagrama de dispersión o nube de puntos. A partir de esta representación el
investigador puede especificar la forma funcional de la función de regresión.
Por ejemplo:
Ejemplo 1
La siguiente tabla muestra
> setwd(“F:/Desktop/EJEMPLOSRS3”)
> datos <- read.table(“F:/Desktop/EJEMPLOSRS3/ejemplo1.txt”, header = TRUE)
> datos
edad Presión
1 56 148
2 42 126
3 72 159
4 36 118
5 63 149
6 47 130
7 55 151
8 47 142
9 38 114
10 42 141
Supongamos que nuestro objetivo es determinar la edad de una mujer a partir
de su presión sanguínea o, lo que es lo mismo, supongamos que la variable
dependiente es edad y que la variable independiente es presión. Vamos a
representar el diagrama de dispersión de las dos variables para determinar si la
relación existente entre ambas puede considerarse lineal, y por tanto, tiene
sentido plantear un modelo de regresión lineal simple.
> plot(presion, edad)
El parámetro es igual a 0.6774 indica que, por término medio, cada mmHg
(milímetros de mercurio) de incremento en la presión sanguínea de una persona
supone un incremento de 0.6774. en su edad.
Podemos obtener más información sobre el modelo de regresión que hemos
calculado aplicando la función summary al objeto que contiene los datos de la
regresión, al cual hemos llamado reg_lin en este ejemplo.
> summary(reg_lin)
Call:
lm(formula = edad ~ presion)
Residuals:
Min 1Q Median 3Q Max
-9.9676 -2.9835 -0.0973 3.8623 7.8394
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -43.5440 17.6126 -2.472 0.038571 *
presion 0.6774 0.1271 5.328 0.000704 ***
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.742 on 8 degrees of freedom
Multiple R-squared: 0.7802, Adjusted R-squared: 0.7527
F-statistic: 28.39 on 1 and 8 DF, p-value: 0.000704
Esta salida contiene una información más completa sobre el análisis. Así, por
ejemplo, encontramos información sobre los residuos (en el apartado Residuals),
que se definen como la diferencia entre el verdadero valor de la variable
dependiente y el valor que pronostica el modelo de regresión. Cuanto más
pequeños sean estos residuos mejor será el ajuste del modelo a los datos y más
acertadas serán las predicciones que se realicen a partir de dicho modelo.
En la tabla Coefficients encontramos los valores de los parámetros que aparecían
en la salida por defecto junto a su error estándar. Cada parámetro aparece
acompañado del valor de un estadístico t de Student y un p-valor que sirven para
contrastar la significación del parámetro en cuestión, es decir, para resolver los
siguientes contrastes de hipótesis:
Al aplicar la función plot sobre el objeto que contiene la información del modelo
obtenemos 4 gráficos que nos ayudan para la validación del modelo. Estos
gráficos son:
Los gráficos parecen indicar que los residuos son aleatorios, independientes y
homocedásticos. Sin embargo, no parece que los residuos sigan una distribución
Normal. Vamos a confirmar si esto es así mediante métodos analíticos.
donde
x es un vector numérico con los datos a los que vamos a aplicar el test (en nuestro caso,
los residuos)
distrib indica la distribución de referencia que se usará en el contraste (en nuestro caso,
la distribución Normal, por lo que distrib = pnorm)
Al realizar un análisis de regresión lineal, R y RStudio guardan automáticamente
los residuos en el objeto que almacena la información de la regresión (y que
nosotros hemos llamado reg_lin). Para acceder a estos residuos,
escribiremos $residuals a continuación del nombre del objeto que contiene la
información del análisis. Por tanto, podemos realizar el contraste de Kolmogorov-
Smirnov del siguiente modo:
> ks.test(reg_lin$residuals, “pnorm”)
One-sample Kolmogorov-Smirnov test
data: reg_lin$residuals
D = 0.3935, p-value = 0.06608
alternative hypothesis: two-sided
Los resultados del test nos confirman lo que se intuía en el gráfico Q-Q: a un
10% de significación los residuos no siguen una distribución normal, puesto que
el p-valor que se obtiene (0.06608) es menor que 0.1. Sin embargo para una
significación del 5% no se debe rechazar la hipótesis nula.
donde
donde
> gastos <- c(1000, 580, 520, 500, 600, 550, 400)
> ingresos <- c(50000, 2500, 2000, 1900, 3000, 4000, 2000)
> tamaño <- c(7, 4, 3, 3, 6, 5, 2)
> hijosU <- c(3,1,1,0,1,2,0)
Y vamos a agrupar la información relativa a las 4 variables de las que
disponemos en un data frame al que pondremos por nombre datos2:
> datos2 <- data.frame(gastos, ingresos, tamaño, hijosU)
Comprobemos que, efectivamente, el data frame que hemos creado contiene la
información sobre las 4 variables:
> datos2
gastos ingresos tamaño hijosU
1 1000 50000 7 3
2 580 2500 4 1
3 520 2000 3 1
4 500 1900 3 0
5 600 3000 6 1
6 550 4000 5 2
7 400 2000 2 0
A continuación ajustamos el modelo de regresión lineal múltiple
> reg_lin_mul <- lm(gastos ~ ingresos + tamaño + hijosU)
> summary(reg_lin_mul)
Call:
lm(formula = gastos ~ ingresos + tamaño + hijosU)
Residuals:
1234567
1.216 48.164 29.125 15.209 -10.134 -35.402 -48.178
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.590e+02 6.291e+01 5.706 0.0107 *
ingresos 7.247e-03 1.802e-03 4.021 0.0276 *
tamaño 3.734e+01 2.046e+01 1.825 0.1655
hijosU 5.359e+00 4.061e+01 0.132 0.9034
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 48.57 on 3 degrees of freedom
Multiple R-squared: 0.9677, Adjusted R-squared: 0.9353
F-statistic: 29.93 on 3 and 3 DF, p-value: 0.009772
donde
Ejemplo 3
Vamos a calcular el coeficiente de correlación lineal de Pearson entre las
variables gastos e ingresos:
> cor(gastos, ingresos)
[1] 0.9465675
> cor(datos2)
gastos ingresos tamaño hijosU
gastos 1.0000000 0.9465675 0.8457301 0.8627733
ingresos 0.9465675 1.0000000 0.6886470 0.7885404
tamaño 0.8457301 0.6886470 1.0000000 0.8416254
hijosU 0.8627733 0.7885404 0.8416254 1.0000000
En este caso, en lugar de un único valor numérico, la función cor devuelve una
matriz simétrica con las correlaciones entre las variables.
Habitualmente, se está interesado en contrastar si la correlación lineal entre
pares de variables puede considerarse 0 o no. Es decir, se quiere resolver
el contraste
donde
Ejercicios
Ejercicios Guiados
Ejercicio guiado
Una empresa fabricante de cereales está interesada en conocer cómo afecta a las
ventas del producto, la publicidad en la televisión, en la radio y en los periódicos.
Para ello, realiza un estudio de los gastos mensuales (en miles de euros)
correspondientes a los últimos 20 meses. Estos datos se presentan en la siguiente
tabla.
Ventas Pub(tv) Pub(radio) Pub(peri�d.)
10 13 56 40
12 14 55 40
11 15 60 42
13 17 65 50
12 17.5 69 40
14 13 67 44
16 14.5 68 40
12 9 67 44
14 8 97 46
11 9 66 46
10 8 65 45
19 10 60 110
8.5 17 70 30
8 18 110 50
9 18.5 75 45
13 19 80 40
16 20 85 80
18 20 90 90
20 13 56 90
22 14 55 110
Tabla3: Datos del Ejemplo Guiado 1
a) Crea 4 vectores numéricos, de manera que cada uno contenga los datos de una
columna y un data frame llamado Cerealescon los 4 vectores que acabas de crear
> cereales
ventas tv radio periodicos
1 10.0 13.0 56 40
2 12.0 14.0 55 40
3 11.0 15.0 60 42
4 13.0 17.0 65 50
5 12.0 17.5 69 40
6 14.0 13.0 67 44
7 16.0 14.5 68 40
8 12.0 9.0 67 44
9 14.0 8.0 97 46
10 11.0 9.0 66 46
11 10.0 8.0 65 45
12 19.0 10.0 60 110
13 8.5 17.0 70 30
14 8.0 18.0 110 50
15 9.0 18.5 75 45
16 13.0 19.0 80 40
17 16.0 20.0 85 80
18 18.0 20.0 90 90
19 20.0 13.0 56 90
20 22.0 14.0 55 110
Otra opción es, Seleccionar en el menú principal: Session/Set Working
Directory/Choose Directory (Ctrl+Shift+H) y en la Consola de RStudio se muestra
la siguiente orden:
> setwd(“F:/Desktop/EJEMPLOSRS3”)
A continuación leemos el fichero utilizando read.table
> cereales <- read.table(“F:/Desktop/EJEMPLOSRS3/cereales.txt”, header = TRUE).
b) Representa el diagrama de dispersión de las ventas y la publicidad en tv
Por otra parte, el valor de R² (0.001785) nos lleva a concluir que el ajuste del
modelo a los datos es muy malo.
e) ¿Cuál sería la recta de regresión en el caso de que se considere un modelo de
regresión lineal simple sin constante?
> reg_lin2 <- lm(ventas ~ 0 + tv, data = cereales)
> reg_lin2
Call:
lm(formula = ventas ~ 0 + tv, data = cereales)
Coefficients:
tv
0.8673
Call:
lm(formula = ventas ~ tv + radio, data = cereales)
Coefficients:
(Intercept) tv radio
17.38543 0.03823 -0.06370
Solución:
Ventas <-c(10,12,11,13,12,14,16,12,14,11,10,19,8.5,8,9,13,16,18,20,22)
tv <- c(13,14,15,17,17.5,13,14.5,9,8,9,8,10,17,18,18.5,19,20,20,13,14)
radio <-c(56,55,60,65,69,67,68,67,97,66,65,60,70,110,75,80,85,90,56,55)
periódicos <- c(40,40,42,50,40,44,40,44,46,46,45,110,30,50,45,40,80,90,90, 110)
cereales <- data.frame(ventas, tv, radio, periodicos)
cereales
plot(cereales$ventas,cereales$tv)
reg_lin <- lm(ventas ~ tv, data = cereales)
reg_lin
summary(reg_lin)
reg_lin2 <- lm(ventas ~ 0 + tv, data = cereales)
reg_lin2
cor(cereales$ventas, cereales$tv)
cor.test(cereales$ventas, cereales$tv)
reg_lin_mul <- lm(ventas ~ tv + radio, data = cereales)
reg_lin_mul
reg_lin_mul2 <- lm(ventas ~ tv + radio + periodicos, data = cereales)
reg_lin_mul2
summary(reg_lin_mul2)
Ejercicios Propuestos
Ejercicio Propuesto
Con el objetivo de realizar un estudio de mercado sobre el precio de los pisos, se
seleccionan de forma aleatoria una muestra estratificada representativa de los
distintos barrios de una ciudad. Los datos sobre el precio de los pisos en miles de
euros, la superficie en m² y la antigüedad del inmueble en años, se muestran en la
siguiente tabla.
c) ¿Cuál es la recta de regresión lineal simple que considera al precio como variable
dependiente y a la superficie como variable independiente? Interpreta los
parámetros de esa recta
Call:
lm(formula = precio ~ superficie, data = pisos)
Coefficients:
(Intercept) superficie
-7.813 1.747
La recta de regresión lineal simple es: precio = -7.813 + 1.747 superficie
d) ¿Son significativos estos parámetros? ¿Qué puede decirse del ajuste del modelo
a los datos?
Call:
lm(formula = precio ~ superficie, data = pisos)
Residuals:
Min 1Q Median 3Q Max
-69.436 -25.020 -3.061 12.960 154.147
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -7.8131 27.5629 -0.283 0.78
superficie 1.7472 0.2181 8.012 2.4e-07 ***
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 47.92 on 18 degrees of freedom
Multiple R-squared: 0.781, Adjusted R-squared: 0.7688
F-statistic: 64.19 on 1 and 18 DF, p-value: 2.399e-07
Considerando un nivel de significación del 5%, sólo es significativamente
distintos de 0 el parámetro superficie, ya que su p-valor (2.4e-07) es inferior
a 0.05.
El ajuste del modelo a los datos es aceptable, ya que el valor de R² es de 0.781
e) ¿Cuál es la correlación lineal de Pearson entre ambas variables? ¿Es
significativa?
Pearson’s product-moment correlation
data: pisos$precio and pisos$superficie
t = 8.012, df = 18, p-value = 2.399e-07
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.7245916 0.9534095
sample estimates:
cor
0.883743
El coeficiente de correlación lineal de Pearson entre las dos variables es
de 0.883743
Con un p-valor de 2.399e-07 < 0.05, rechazamos la hipótesis de que el coeficiente
de correlación lineal de Pearson entre ambas variables pueda considerarse 0.
f) ¿Cuál es la recta de regresión lineal si se considera también como variable
independiente la antigüedad?
Call:
lm(formula = precio ~ antiguedad, data = pisos)
Coefficients:
(Intercept) antiguedad
110.423 4.107
En este caso, la recta de regresión lineales: precio = 110.423 + 4.107 antiguedad
g) Ajustar un modelo de regresión lineal múltiple. Obtener una estimación de los
parámetros del modelo y su interpretación
Call:
lm(formula = precio ~ superficie + antiguedad, data = pisos)
Coefficients:
(Intercept) superficie antiguedad
-6.82133 1.75516 -0.09239
En este caso, la recta de regresión lineal múltiple es: precio = -6.82133 + 1.75516
superficie – 0.09239 antiguedad
h) Contrastar la significación del modelo propuesto
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -6.82133 31.73892 -0.215 0.832
superficie 1.75516 0.25176 6.972 2.25e-06 ***
antiguedad -0.09239 1.32791 -0.070 0.945
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 49.3 on 17 degrees of freedom
Multiple R-squared: 0.7811, Adjusted R-squared: 0.7553
F-statistic: 30.32 on 2 and 17 DF, p-value: 2.47e-06
El único parámetro significativamente distinto de cero es superficie (P-valor
= 2.25e-06)
i) ¿Puede eliminarse alguna variable del modelo? Razona la respuesta
Se puede eliminar la variable antiguedad ya que su p-valor es 0.945 > α =
0.05, por lo que no rechazamos la hipótesis nula de significación de dicha
variable. Esta variable no es válida para predecir el precio de los pisos
j) Coeficiente de determinación y de determinación corregido. Interpretación
El coeficiente de determinaciónes 0.7811 y el de determinación corregido
es 0.7553. No se aprecian grandes diferencias entre ambos coeficientes.
Call:
lm(formula = precio ~ superficie + antiguedad^2, data = pisos)
Coefficients:
(Intercept) superficie antiguedad
-6.82133 1.75516 -0.09239
precio <- c(250, 130, 165, 310, 320, 400, 200, 80, 69, 179, 120, 223,
300, 198, 165, 69, 73, 123, 356, 183)
superficie <- c(120, 80, 100, 180, 190, 250, 99, 90, 60, 100, 110,
120, 180, 130, 90, 50, 60, 70, 120, 130)
antiguedad <-c(15, 20, 30, 15, 12, 40, 30, 27, 14, 20, 22, 25, 21, 33,
5, 12, 6, 10, 28, 30)
pisos <- data.frame(precio, superficie, antiguedad)
pisos
plot(pisos$precio,pisos$superficie)
reg_lin <- lm(precio ~ superficie, data = pisos)
reg_lin
summary(reg_lin)
cor(pisos$precio, pisos$superficie)
reg_lin2 <- lm(ventas ~ 0 + tv, data = cereales)
reg_lin2
cor(pisos$precio, pisos$superficie)
cor.test(pisos$precio, pisos$superficie)
reg_lin1 <- lm(precio ~ antiguedad, data = pisos)
reg_lin1
reg_lin_mul <- lm(precio ~ superficie + antiguedad, data = pisos)
reg_lin_mul
summary(reg_lin_mul)
reg_lin_mul2 <- lm(precio ~ superficie + antiguedad^2, data = pisos)
reg_lin_mul2