Es un procedimiento estadístico para crear un modelo matemático (una fórmula) que relacione los valores de una variable \(y\) (variable dependiente) en función de los valores de una variable \(x\) (variable independiente). Es el más sencillo y popular para relacionar y predecir variables cuantitativas continuas.
Este modelo puede utilizarse para predecir el futuro comportamiento de la variable dependiente, en caso de disponer de nuevos valores de la variable independiente.
El modelo matemático puede expresarse con la fórmula \(y = ax + b + e\), en el que:
\(a\): es la pendiente de la recta. Indica cuánto aumenta \(y\) por cada aumento de una unidad de \(x\).
\(b\): es el origen de la recta. Equivale al valor de \(y\) cuando \(x\) es 0.
\(e\): es el error aleatorio (también conocidos como residuos). Son las diferencias entre el valor teórico proporcionado por el modelo estadístico y el valor real (equivalente a aquella parte de la relación que no puede ser explicada por el modelo), y se atribuye a errores de medición o desviaciones aleatorias de las condiciones de regresión.
Figura 1: Cálculo de los términos \(a\) y \(b\) según el método de mínimos cuadrados
Los término \(a\) y \(b\) pueden calcularse según diferentes métodos. El más simple es el de mínimos cuadrados (aunque existan otros como el de máxima verosimilitud), que consiste en encontrar aquellos valores de \(a\) y \(b\) que hagan mínima la suma de los cuadrados de las desviaciones de las observaciones respecto de la recta que representa el modelo, ya que en este caso, la relación entre ambas variables es representada por una línea recta.
Supongamos las siguientes variables:
<- c(0.8,1,1.2,1.3)
x_ejemplo1 <-c(1,2,3,5) y_ejemplo1
Figura 2: Ejemplo de regresión lineal entre dos variables desarrollado
<- mean(x_ejemplo1)
media_x_ejemplo1 <- mean(y_ejemplo1)
media_y_ejemplo1
<- length(x_ejemplo1) # Número de casos n_ejemplo1
<- x_ejemplo1 * y_ejemplo1 # Columna producto X*Y
x.y_ejemplo1 <- sum(x.y_ejemplo1) # Suma columna X*Y
suma.x.y_ejemplo1 <- sum(x.y_ejemplo1)/n_ejemplo1 - media_x_ejemplo1 * media_y_ejemplo1 cov.x.y_ejemplo1
<- x_ejemplo1^2 # Columna con los cuadrados de X
x_cuadrado_ejemplo1 <- sum(x_cuadrado_ejemplo1)
suma.x_cuadrado_ejemplo1
<- (suma.x_cuadrado_ejemplo1 / n_ejemplo1) - media_x_ejemplo1^2 varianza_x_ejemplo1
# Parámetro A
<- cov.x.y_ejemplo1 / varianza_x_ejemplo1
A_ejemplo1
A_ejemplo1
# Parámetro B
<- media_y_ejemplo1 - A_ejemplo1 * media_x_ejemplo1
B_ejemplo1 B_ejemplo1
Por lo tanto, nuestro modelo de regresión tomaría la forma de \(y = 7.2x - 5.084746\).
rm(list=ls())
La función básica para obtener un modelo de regresión lineal es
lm()
. Su sintaxis es la siguiente:
lm(formula, data, …)
donde:
El primer argumento es una fórmula y ~ x
en la que
se especifica cuál es la variable dependiente (\(y\)) y cuál es la variable independiente
(\(x\)).
El segundo argumento, data
especifica de qué fichero
se extraen dichas variables.
Tomando como referencia el ejemplo elaborado manualmente la sintaxis sería la siguiente:
<- c(0.8,1,1.2,1.3)
x_ejemplo1 <-c(1,2,3,5)
y_ejemplo1 lm(y_ejemplo1 ~ x_ejemplo1)
En la salida del procedimiento, los coefficents
equivalen a los parámetros a
y b
.
b = -5.085. Es el origen. Este valor equivale al valor de la variable y cuando el valor de la variable x es 0. En muchas ocasiones, este parámetro no es demasiado útil, dado que un valor \(x = 0\) es absolutamente teórico.
a = 7.288. Es la pendiente. Esto significa que un aumento de una unidad en \(x\) está asociado con un aumento de 7,288 unidades en \(y\).
Aunque parezca sencillo, la elaboración de un modelo de regresión requiere superar varios pasos:
Evaluar si las variables \(x\) e \(y\) cumplen ciertos supuestos.
Obtener el modelo.
Analizar los diferentes parámetros que resumen el modelo de regresión.
Revisar ciertos estadísticos y gráficos de diagnóstico.
Dibujar el modelo de regresión.
Utilizar el modelo para hacer predicciones.
En este ejemplo recurriremos al análisis de algunas variables del
conjunto de datos mtcars
. En principio, nos interesa saber
si existe relación entre dos variables:
m
: consumo del vehículo (recorrido en millas con un
galón de combustible -aprox 3.5 litros).
wt
: peso del vehículo (1000 lbs)
Podemos asumir que el consumo de un vehículo (variable dependiente)
vendrá parcialmente determinado por su peso (variable independiente) de
tal manera que a más peso recorrerá menos porque consumirá más. Por lo
tanto, mpg
será \(y\) y
wt
será \(x\).
data("mtcars") # Cargamos el fichero directamente del conjunto de ficheros disponibles en R
str(mtcars)
Para poder utilizar un modelo de regresión lineal es necesario que se cumplan con los siguientes supuestos:
Linealidad: que la relación entre las variables sea lineal.
Normalidad: que las variables tengan una distribución simétrica y gaussiana.
La observación de la nube de puntos de un gráfico de dispersión puede ayudar a confirmar si existe una relación lineal entre ambas variables,
plot(mtcars$mpg ~ mtcars$wt) # dependiente ~ independiente
plot(mtcars$wt, mtcars$mpg) # independiente, dependiente
La condición de normalidad de ambas variables puede ser evaluada de diversas maneras
<- mean(mtcars$mpg) # Cálculo de la media
media_mpg <- sd(mtcars$mpg) # Cálculo de la desviación típica
desv_tipica_mpg hist(mtcars$mpg, prob=TRUE, # Histograma
xlab="mpg", ylim=c(0, 0.10),
main="Curva normal sobre el histograma")
curve(dnorm(x, mean=media_mpg, sd=desv_tipica_mpg), # Curva normal
col="darkblue", lwd=2, add=TRUE)
<- mean(mtcars$wt) # Cálculo de la media
media_wt <- sd(mtcars$wt) # Cálculo de la desviación típica
desv_tipica_wt hist(mtcars$wt, prob=TRUE, # Histograma
xlab="wt", ylim=c(0, 0.60),
main="Curva Normal")
curve(dnorm(x, mean=media_wt, sd=desv_tipica_wt), # Curva normal
col="darkblue", lwd=2, add=TRUE)
qqnorm(mtcars$mpg, # Gráfico Q-Q
pch = 1,
frame = FALSE)
qqline(mtcars$mpg, # Línea recta de referencia añadida
col = "steelblue", # Color de la línea
lwd = 2) # Anchura de la línea
El paquete car incorpora la función
qqPlot
que elabora directamente este tipo de gráfico. Este
gráfico incorpora las bandas de confianza, que permiten detectar qué
casos pueden ser considerados atípicos.
# install.packages("car")
library("car")
qqPlot(mtcars$mpg) # Dos puntos aparecen fuera del intervalo de confianza (la zona entre las lineas a rayas):
Otra posibilidad para evaluar esta condición es aplicar el test de Shapiro-Wilks. Recordemos que:
Hipótesis H0: cuando p-value es mayor que \(\alpha\) = 0,05 -> aceptar H0 -> la variable presenta una distribución normal
Hipótesis H1: cuando p-value es menor que \(\alpha\) = 0,05 -> rechazar H0 -> la variable presenta una distribución no normal.
shapiro.test(mtcars$mpg)
shapiro.test(mtcars$wt)
De acuerdo con lo expuesto, ambas variables siguen aproximadamente una distribución normal, por lo que, en teoría, podríamos someter ambas variables a un análisis de regresión.
rm(desv_tipica_mpg, desviacion_tipica_wt, media_mpg, media_wt)
La función lm()
crea un objeto de R que se denominará
modelo_regresion_1
. Éste es una lista conteniendo la
información relevante sobre el análisis realizado.
<- lm(mpg ~ wt, # Variable dependiente ~ Variable independiente
modelo_regresion_1 data = mtcars)
print(modelo_regresion_1)
De acuerdo con los resultados, la ecuación de la recta de mínimos cuadrados es: \(y= -0.5.344x + 37.285\).
La información contenida en el objeto modelo_regresion_1
es muy abundante. Se puede utilizar la función attributes()
para mostrar esa información.
attributes(modelo_regresion_1)
Es posible acceder a cada uno de los elementos individuales de esa lista usando el operador $ entre el objeto y el elemento de la lista. En este caso, los parámetros \(a\) y \(b\).
$coefficients # Parámetros $a$ y $b$ de la ecuación modelo_regresion_1
También pueden visualizarse los valores ajustados (valores teóricos
de mgp
al aplicar el modelo, también llamados
predicciones).
$fitted.values modelo_regresion_1
También pueden visualizarse los resíduos, es decir, la diferencia entre el valor real de \(y\) y su valor teórico, obtenido a partir del modelo de regresión. Cuanto más pequeños sean 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.
$residuals modelo_regresion_1
Los valores ajustados y los residuales también se pueden recuperar
usando las funciones fitted()
y residuals()
aplicadas al objeto resultante de la función lm()
.
fitted(modelo_regresion_1)
residuals(modelo_regresion_1)
El resumen del modelo de regresión se obtiene aplicando la función
summary
.
summary(modelo_regresion_1)
Los resultados de esta función son los siguientes:
Call: muestra la función usada para calcular el modelo de regresión.
Residuals: ofrece una rápida visión de la distribución de los resíduos (diferencia entre el valor real de \(y\) y el calculado), cuya media es, por definición, 0. Un buen modelo es aquel en el que la diferencia entre la media y la mediana es próxima a 0, y los valores máximos y mínimos tienen valores absolutos similares.
Coefficients: valor de la pendiente y origen del modelo y su significación estadística. Por lo tanto, en este ejemplo la ecuación de la recta de mínimos cuadrados es: \(y = -5.34x + 37.28\).
Residuals Standard Error (RSE): métrica que informa de cómo se ajusta el modelo a los datos originales. Cuanto más bajo sea el valor el modelo se ajusta mejor.
R-Squared: es otro indicador que informa de la bondad del ajuste del modelo a los datos. Ocila entre 0 y 1; valores próximos a 1 indican un buen ajuste del modelo lineal a los datos.
Adj R-Squared: similar a R², pero penaliza la introducción en el modelo de variables independientes poco relevantes a la hora de explicar la variable dependiente. Si R² = 0.9293 y R² ajustado = 0.9268, se puede concluir que el modelo lineal se ajusta de forma aceptable a nuestros datos
F-statistic: cuanto más alto mejor.
Merece la pena detenernos un poco más en los valores de los coeficientes. La tabla contiene:
Estimate. Como se ha señalado, son los coeficientes del modelo de regresión. Si están significativamente asociadas a la variable de resultado, están marcadas con estrellas.
Standard errors (SE): definen la precisión de los coeficientes anteriores. Para un coeficiente dado, el SE refleja cómo varía el coeficiente bajo muestreo repetido. Se puede utilizar para calcular los intervalos de confianza y la estadística t.
t-value: su valor se calcula dividiendo el coeficiente por la desviación típica. Es usado para verificar si el coeficiente es o no significativamente diferente de 0. Para ello, las hipótesis son:
Hipótesis Nula (H0): los coeficientes son iguales a 0 (no hay relación entre x e y).
Hipótesis alternativa (H1): los coeficientes no son iguales a 0 (si hay relación entre x e y).
Si no es significativamente diferente, el coeficiente no añade información al modelo y podríamos prescindir de él.
Es habitual acompañar el modelo de regresión con un diagrama de puntos y dibujar sobre él la recta de regresión.
plot(mpg ~ wt,
data = mtcars, pch = 19, col = "darkblue") # Creamos el gráfico
abline(modelo_regresion_1, col = "red", lwd = 3) # Línea de regresión
text(paste("Correlación:", round(cor(mtcars$mpg, mtcars$wt), 2)),
x = 30, # Posición etiqueta: sobre el valor 30 de x
y = 5) # Posición etiqueta: sobre el valor 5 de y
Incluso, sobre ese gráfico podemos incluir los coeficientes y el modelo de regresión
plot(mpg ~ wt,
data = mtcars, pch = 16)
abline(modelo_regresion_1, col="red", lwd=2) # Añade una recta de regresión
segments(mtcars$wt, # Añade las desviaciones individuales
fitted(modelo_regresion_1),
$wt,
mtcars$mpg,
mtcarscol="red")
<- cor(mtcars$mpg,mtcars$wt) # Calculamos la correlación entre las variables
etiqueta_corr text(paste("Correlación:", round(etiqueta_corr, 2)),
x = 5,
y = 30)
<- round(coef(lm(mtcars$mpg ~ mtcars$wt)), 2) # Calculamos el modelo de regresion
coef text(paste("Y = ", coef[1], "+", coef[2], "x"),
x = 5,
y = 27)
También es habitual dibujar una curva suavizada por medio del método LOWESS, para comparar sus resultados con los del método por mínimos cuadrados. Este método LOWESS es una regresión no paramética de carácter polinómico
plot(mpg ~ wt, data = mtcars, pch = 19, col = "darkblue")
abline(modelo_regresion_1, col="red", lwd=2) # Añade una recta de regresión
lines(lowess(mtcars$wt, mtcars$mpg), col = "blue", lwd = 3) # Ajuste suavizado
legend("topright",
legend = c("Lineal", "Suavizado"),
lwd = 3,
lty = c(1, 1),
col = c("red", "blue"))
Desafío.
EJERCICIO 1. A partir del dataframe alumnos_UC.Rdata
elabora un modelo de regresión que relacione las variables peso y
altura.
<- mean(df$edad) # Cálculo de la media
media_edad <- sd(df$edad) # Cálculo de la desviación típica
desv_tipica_edad hist(df$edad, prob=TRUE, # Histograma
xlab="edad", ylim=c(0, 0.30),
main="Curva normal sobre el histograma")
curve(dnorm(x, mean=media_edad, sd=desv_tipica_edad), # Curva normal
col="darkblue", lwd=2, add=TRUE)
<- mean(df$peso) # Cálculo de la media
media_peso <- sd(df$peso) # Cálculo de la desviación típica
desv_tipica_peso hist(df$peso, prob=TRUE, # Histograma
xlab="peso", ylim=c(0, 0.05),
main="Curva normal sobre el histograma")
curve(dnorm(x, mean=media_peso, sd=desv_tipica_peso), # Curva normal
col="red", lwd=2, add=TRUE)
shapiro.test(df$edad)
shapiro.test(df$peso)
<- lm(edad ~ peso,
regresion_peso_edad data = df)
$fitted.values
regresion_peso_edad
<- regresion_peso_edad$fitted.values
residuos_peso_edad <- cbind(df, residuos_peso_edad) df
summary(regresion_peso_edad)
plot(edad ~ peso,
data = df, pch = 16)
abline(regresion_peso_edad, col="red", lwd=2) # Añade una recta de regresión
<- cor(df$peso,df$edad) # Calculamos la correlación entre las variables
etiqueta_corr text(paste("Correlación:", round(etiqueta_corr, 2)),
x = 60,
y = 24)
<- round(coef(lm(df$edad ~ df$peso)), 2) # Calculamos el modelo de regresion
coef text(paste("Y = ", coef[1], "+", coef[2], "x"),
x = 70,
y = 20)
EJERCICIO 2. A partir del dataframe zonas_verdes.Rdata
elabora un modelo de regresión que relacione las variables superficie
(variable dependiente) y parques (variable independiente).
library("car")
qqPlot(zonas_verdes$superficie)
qqPlot(zonas_verdes$parques)
shapiro.test(zonas_verdes$superficie)
shapiro.test(zonas_verdes$parques)
<- lm(superficie ~ parques,
regresion_superficie_parques data = zonas_verdes)
<- cbind(regresion_superficie_parques$residuals, regresion_superficie_parques$fitted, zonas_verdes$parques) observados_vs_prediccion
plot(superficie ~ parques,
data = zonas_verdes, pch = 10)
abline(regresion_superficie_parques, col="red", lwd=2)
Que observemos cómo la recta dibujada anteriormente parece ajustarse a los datos iniciales no significa que el modelo sea correcto:
Si sólo pretendemos hallar la relación entre dos variables, con calcular el modelo ya sería suficiente.
Si el fin del modelo es predecir, es necesario comprobar que se verifican unas reglas ya establecidas que aseguran la bondad (calidad) del modelo.
Esta comprobación se puede realizar de dos maneras:
Calculando una serie de estadísticos.
Representando gráficamente esos estadísticos mediante una serie
de gráficos de diagnóstico. Estos gráficos se aplican a los resíduos del
modelo de regresión, e identifican posibles problemas en el modelo que
podrían en riesgo los resultados obtenidos. Esto se hace con la función
plot()
aplicada al objeto resultante de aplicar la función
lm()
.
Podemos comenzar representando estos gráficos.
plot(modelo_regresion_1)
Estos gráficos también se pueden obtener en un único panel:
par(mfrow=c(2,2))
plot(modelo_regresion_1, which = 1)
plot(modelo_regresion_1, which = 2)
plot(modelo_regresion_1, which = 3)
plot(modelo_regresion_1, which = 4)
par(mfrow=c(1,1)) # devuelve la pantalla a su estado original
El significado de estos gráficos es el siguiente:
Podemos mejorar la identificación de casos inusuales (gráfico 1) recurriendo a la representación de un boxplot.
par(mfrow=c(1, 2)) # Dividimos el área de los gráficos en 2 columnas
boxplot(mtcars$mpg, main="Variable X") # Gráfico de caja y bigotes para la variable X
boxplot(mtcars$wt, main="Variable Y")
par(mfrow=c(1,1)) # Devolvemos la pantalla a su estado original
Valores atípicos - La independencia de los errores
<- residuals(modelo_regresion_1) # Residuos
residuos plot(residuos,
rstandard(modelo_regresion_1),
xlab="Variable X",
ylab="Variable Y")
Puede observarse que, de acuerdo a la definición de casos atípicos,
la variable wt
contaría con dos observaciones de este tipo.
Para confirmar que ambos casos si pueden ser considerados atípicos, los
cuantificaremos con valores elevados de parámetro Studentised residual
obtenida con la función rstudent()
.
<- rstudent(modelo_regresion_1)
outliers outliers
También podemos obtener el valor del Leverage, que señala a observaciones muy diferentes de las restantes, aunque no corresponde necesariamente a un residuo muy alto.
<- hatvalues(modelo_regresion_1)
leverage leverage
Y finalmente, la distancia de Cook.
<- cooks.distance(modelo_regresion_1)
distancia_cook distancia_cook
Valores superiores a 1 en la distancia de Cook’son considerados muy grandes
plot(cooks.distance(modelo_regresion_1),
pch = 16,
col = "blue")
Este gráfico se usa para verificar la asumción de igualdad de varianzas (también conocida como “homoscedasticidad”) entre los resíduos del modelo de regresión. Si la línea roja que aparece en el gráfico es aproximadamente horizontal, se cumple esta condición; idealmente, los residuos deben estar aleatoriamente distribuidos a lo largo del gráfico, sin formar ningún tipo de patrón.
Figura 3: Gráfico de los resíduos de un modelo de regresión mostrando heteroscedasticidad
En el ejemplo citado se ve cómo la línea no es totalmente horizontal, si bien no se desvía demasiado de la horizontalidad. Entonces se puede considerar que el modelo no viola la asumción de igualdad de varianzas.
Es posible desarrollar un poco más esta condición:
plot(fitted.values(modelo_regresion_1),
rstandard(modelo_regresion_1),
xlab="Valores ajustados",
ylab="Residuos estandarizados",
ylim = c(-3,3)) # gráfico 2D de los valores ajustados vs. los residuos estandarizados
abline(h=0, col = "red")
Además, se puede aplicar la prueba de Breush-Pagan. Si el valor-p es menor que el nivel de significancia usual de 5%, no se cumple la homocedasticidad.
library(lmtest)
bptest(modelo_regresion_1)
Una aproximación aún más correcta es someter los residuos al test de varianza no constante (Cook y Weisberg 1983). De acuerdo con esta prueba:
H0 hipótesis nula: los residuos violan la homogeneidad de la varianza.
H1 Hipotesis alternativa: los residuos no violan la homogeneidad de la varianza.
Probabilidades superiores a 0,05 rechazan la hipótesis nula: son indicativo de que los residuos no violan la homogeneidad de la varianza
if(!require("car")) install.packages("car")
library(car)
residualPlots(modelo_regresion_1)
ncvTest(modelo_regresion_1)
Otras posibilidades de evaluación de la normalidad de los residuos son las siguientes:
hist(residuos,
xlab = "Valor del resíduo",
main = "Histograma de resíduos",
breaks = 10)
qqnorm(residuos)
qqline(residuos)
Podrían también transformarse en puntuaciones z. Es deseable que los residuos estandarizados estén lo más cerca posible a la línea punteada que aparece en el gráfico.
<- rstandard(modelo_regresion_1) # Calcula los resíduos estandarizados del modelo ajustado (completo)
z_residuos
par(mfrow=c(1,3)) # Divide la ventana en una fila y tres columnas
hist(z_residuos) # Histograma de los residuos estandarizados
boxplot(z_residuos, ylim = c(-3,3)) # Diagrama de cajas de los residuos estandarizados
qqnorm(z_residuos) # gráfico de cuantiles de los residuos estandarizados
qqline(z_residuos)
par(mfrow=c(1,1)) # devuelve la pantalla a su estado original
Y por último, ser sometidos a un contraste de hipótesis.
shapiro.test(modelo_regresion_1$residuals)
De acuerdo con todo lo expuesto, los resíduos presentan una distribución que no se aleja de la distribución normal.
Linearidad de la relación
<- fitted.values(modelo_regresion_1)
valores_ajustados_1 plot(valores_ajustados_1,
$wt,
mtcarsxlab = "Fitted Values",
ylab = "Observed Values")
Si se quisiera realizar un análisis en profundidad de todos estos aspectos, se podrían integrar en un único dataframe.
<- data.frame(mtcars$mpg,
datos_problema_regresion $wt,
mtcars$fitted.values,
modelo_regresion_1$residuals,
modelo_regresion_1
outliers,
leverage, distancia_cook)
La función predict()
se usa para predecir el valor de la
variable dependiente para nuevas observaciones de la variable
independiente. Para ello, se creará un nuevo dataframe que contendrá 10
valores nuevos (que oscilan entre 1.5 y 5,5) de la variable
independiente wt
. Queremos saber cuánto podrán circular
estos nuevos vehículos utilizando el modelo de regresión calculado
previamente.
<- data.frame(wt = sample(1:5.5, size=10, replace = TRUE))
nuevos_datos nuevos_datos
Estos nuevos datos van a incorporarse a la función
predict()
, que usa la información proporcionada por el
modelo de regresión para predecir el valor teórico de \(y\) (mpg
) en función de los
nuevos valores de \(x\)
(wt
). Al mismo tiempo, se creará un nuevo objeto que
incluirá los nuevos valores de \(x\)
con los valores teóricos de \(y\).
<- predict(modelo_regresion_1, # Nuevo dataframe con valores nuevos de y
wt_predicciones
nuevos_datos) <- cbind(nuevos_datos, wt_predicciones) nuevos_datos
La evaluación de un modelo de regresión también puede realizarse
sobre un nuevo conjunto de datos que no ha sido incluido en el
desarrollo del modelo. Para ilustrar este procedimiento incorporamos el
dataset Boston
del paquete MASS. Este
paquete incluye la variable age
, que corresponde a la
proporción de viviendas en propiedad construidas antes de 1940.
library("MASS")
data("Boston") # Cargamos el fichero directamente del conjunto de ficheros disponibles en R
View(Boston)
Para determinar qué variables están mejor correlacionadas con
age
, calculamos una matriz de correlaciones entre todas las
variables.
round(cor(Boston), 2)
Los resultados muestran que age
está correlacionada
positivamente con nox
(contaminante relacionado con el
tráfico de vehículos) y negativamente con dis
(distancia
promedio a los grandes distritos comerciales). En este último caso,
podemos suponer que la mayoría de las viviendas más antiguas se sitúan
en el centro de las ciudades, alejadas de los actuales centros de
negocios, que suelen situarse en la periferia.
En consecuencia, crearemos un nuevo dataframe sólo con ambas variables.
<- subset(Boston, select = c(age, dis))
boston rm(Boston)
El procedimiento habitual el siguiente:
?floor<- floor(0.75 * nrow(boston)) # Devuelve el número entero más pequeño que esa fórmula: conjunto de entrenamiento
smp_size set.seed(123) # Fija la semilla para poder reproducir más tarde el procedimiento
<- sample(seq_len(nrow(boston)),
train_ind size = smp_size)
.1 <- boston[train_ind, ]
entrenamiento.1 <- boston[-train_ind, ] verificacion
Otra manera de hacerlo es mediante la creación de una variable de apoyo para crear los dos subconjuntos (70% vs 30%)
<- sample(c(rep(0, 0.7 * nrow(boston)),
variable_apoyo rep(1, 0.3 * nrow(boston))))
# Verificar el contenido de la variable de apoyo
variable_apoyo table(variable_apoyo) # Verificar si las frecuencias son correctas
.2 <- boston[variable_apoyo == 0, ] # Subconjunto de entrenamiento
entrenamiento.2 <- boston[variable_apoyo == 1, ] # Subconjunto de verificación verificacion
.2 <- lm(age ~ dis,
modelo.regresiondata = entrenamiento.1)
Resumen del modelo de regresión
summary(modelo.regresion.2)
Predicciones
library(caret)
<- predict(modelo.regresion.2,
prediccion.dis .1)
verificacion.1 <- cbind(verificacion.1,
verificacion prediccion.dis)
Evaluación del modelo en los datos de verificación. La raíz del error cuadrático medio (RSME): corresponde a la diferencia media entre los valores predichos y los valores observados. Cuanto más bajo se este error, mejor es el modelo.
RMSE(verificacion.1$dis, verificacion.1$prediccion.dis)
R2(verificacion.1$dis, verificacion.1$prediccion.dis) # Correlación entre los valores observados y los predichos (cuanto más altos, mejor).
ACTIVIDADES DE EVALUACIÓN CONTINUA
El fichero word 03_Actividad_evaluacion_continua_3_2023 contiene una serie de actividades encaminadas a poner en práctica los conocimientos adquiridos. Cada alumnos deberá elaborar un script que contenga los procedimientos necesarios para responder a las cuestiones planteadas, y enviarlo posteriormente al profesor a través de correo electrónico.
Los resultados de esta actividad pueden consultarse en 03_Actividad_evaluacion_continua_3_2023_resuelta