Correlación Lineal y Regresión Lineal Simple
Correlación Lineal y Regresión Lineal Simple
Correlación Lineal y Regresión Lineal Simple
lineal simple
Joaquín Amat Rodrigo
Junio, 2016
Versión PDF: Github
Introducción
La correlación lineal y la regresión lineal simple son métodos
estadísticos que estudian la relación lineal existente entre dos
variables. Antes de profundizar en cada uno de ellos, conviene
destacar algunas diferencias:
La correlación cuantifica como de relacionadas están dos
variables, mientras que la regresión lineal consiste en generar
una ecuación (modelo) que, basándose en la relación existente
entre ambas variables, permita predecir el valor de una a partir
de la otra.
El cálculo de la correlación entre dos variables es
independiente del orden o asignación de cada variable
a XX e YY, mide únicamente la relación entre ambas sin
considerar dependencias. En el caso de la regresión lineal, el
modelo varía según qué variable se considere dependiente de
la otra (lo cual no implica causa-efecto).
A nivel experimental, la correlación se suele emplear cuando
ninguna de las variables se ha controlado, simplemente se han
medido ambas y se desea saber si están relacionadas. En el
caso de estudios de regresión lineal, es más común que una de
las variables se controle (tiempo, concentración de reactivo,
temperatura…) y se mida la otra.
Por norma general, los estudios de correlación lineal preceden
a la generación de modelos de regresión lineal. Primero se
analiza si ambas variables están correlacionadas y, en caso de
estarlo, se procede a generar el modelo de regresión.
Correlación lineal
Para estudiar la relación lineal existente entre dos variables
continuas es necesario disponer de parámetros que permitan
cuantificar dicha relación. Uno de estos parámetros es la covarianza,
que indica el grado de variación conjunta de dos variables aleatorias.
Covarianza muestral=Cov(X,Y)=∑ni=1(xi−x¯¯¯)
(yi−y¯¯¯)N−1Covarianza muestral=Cov(X,Y)=∑i=1n(xi−x¯)(yi−y¯)N−1
siendo x¯¯¯x¯ e y¯¯¯y¯ la media de cada variable y xixi e yiyi el valor
de las variables para la observación ii.
La covarianza depende de las escalas en que se miden las variables
estudiadas, por lo tanto, no es comparable entre distintos pares de
variables. Para poder hacer comparaciones se estandariza la
covarianza, generando lo que se conoce como coeficientes de
correlación. Existen diferentes tipos, de entre los que destacan
el coeficiente de Pearson, Rho de Spearman y Tau de Kendall.
Todos ellos varían entre +1 y -1. Siendo +1 una correlación
positiva perfecta y -1 una correlación negativa perfecta.
Se emplean como medida de fuerza de asociación (tamaño del
efecto):
o 0: asociación nula.
o 0.1: asociación pequeña.
o 0.3: asociación mediana.
o 0.5: asociación moderada.
o 0.7: asociación alta.
o 0.9: asociación muy alta.
Condiciones
La relación que se quiere estudiar entre ambas variables es
lineal (de lo contrario, el coeficiente de Pearson no la puede
detectar).
Las dos variables deben de ser cuantitativas.
Normalidad: ambas variables se tienen que distribuir de forma
normal. Varios textos defienden su robustez cuando las variables
se alejan moderadamente de la normal.
Homocedasticidad: La varianza de YY debe ser constante a lo
largo de la variable XX. Esto se puede identificar si en
el scatterplot los puntos mantienen la misma dispersión en las
distintas zonas de la variable XX. Esta condición no la he
encontrado mencionada en todos los libros.
Características
Toma valores entre [-1, +1], siendo +1 una correlación lineal
positiva perfecta y -1 una correlación lineal negativa perfecta.
Es una medida independiente de las escalas en las que se
midan las variables.
No varía si se aplican transformaciones a las variables.
No tiene en consideración que las variables sean dependientes
o independientes.
El coeficiente de correlación de Pearson no equivale a la
pendiente de la recta de regresión.
Es sensible a outliers, por lo que se recomienda en caso de
poder justificarlos, excluirlos del análisis.
Interpretación
Además del valor obtenido para el coeficiente, es necesario calcular
su significancia. Solo si el p-value es significativo se puede aceptar
que existe correlación y esta será de la magnitud que indique el
coeficiente. Por muy cercano que sea el valor del coeficiente de
correlación a +1 o -1, si no es significativo, se ha de interpretar que la
correlación de ambas variables es 0 ya que el valor observado se
puede deber al azar. (Ver más adelante como calcular la
significancia).
Coeficiente de Spearman
(Spearman’s rho)
Trabaja con rangos, por lo que requiere que las variables cuya
relación se quiere estudiar sean ordinales o que se puedan
transformar en rangos. Al ser no paramétrico, es otra alternativa
al Coeficiente de correlación de Pearson cuando no se cumple la
condición de normalidad. Parece ser más aconsejable que el
coeficiente de Spearman cuando el número de observaciones es
pequeño o los valores se acumulan en una región por lo que el
número de ligaduras al generar los rangos es alto.
τ=C−D12n(n−1),τ=C−D12n(n−1),
Siendo CC el número de pares concordantes, aquellos en los que el
rango de la segunda variable es mayor que el rango de la primera
variable. DD el número de pares discordantes, cuando el rango de la
segunda es igual o menor que el rango de la primera variable.
Tau represents a probability; that is, it is the difference between the
probability that the two variables are in the same order in the observed
data versus the probability that the two variables are in different orders.
Jackknife correlation
−√SE=n−1n∑i=1n(r^i−θ¯)2
θ¯+1.96n−1n∑i=1n(r^i−θ¯)2−−−−−−−−−−−−−−
−√θ¯−1.96n−1n∑i=1n(r^i−θ¯)2 , θ¯+1.96n−1n∑i=1n(r^i−θ¯)2
pvalue=P(Z>Zcalculada)pvalue=P(Z>Zcalculada)
Cuando se emplea este método es conveniente calcular la diferencia
entre el valor de correlación obtenido por Jackknife correlation (θ¯)
(θ¯) y el que se obtiene si se emplean todas las observaciones (r¯)
(r¯). A esta diferencia se le conoce como Bias. Su magnitud es un
indicativo de cuanto está influenciada la estimación de la correlación
entre dos variables debido a un valor atípico u outlier.
Bias=(n−1)∗(θ¯−r^)Bias=(n−1)∗(θ¯−r^)
Si se calcula la diferencia entre cada correlación (r^i)(r^i) estimada
en el proceso de Jackknife y el valor de correlación (r^)(r^) obtenido
si se emplean todas las observaciones, se puede identificar que
observaciones son más influyentes.
Cuando el estudio requiere minimizar al máximo la presencia de
falsos positivos, a pesar de que se incremente la de falsos negativos,
se puede seleccionar como valor de correlación el menor de entre
todos los calculados en el proceso de Jackknife.
Correlacion=min{r^1,r^2,...,r^n}Correlacion=min{r^1,r^2,...,r^n}
A pesar de que el método de Jackknife permite aumentar la robustez
de la correlación de Pearson, si los outliers son muy extremos su
influencia seguirá siendo notable. Siempre es conveniente una
representación gráfica de los datos para poder identificar si hay
valores atípicos y eliminarlos. Otras alternativas robustas son la
correlación de Spearman o el método de Bootsrapping.
library(MASS)
library(ggplot2)
data("Cars93")
1.Análisis de normalidad
Hide
# Representación gráfica
par(mfrow = c(1, 2))
hist(Cars93$Weight, breaks = 10, main = "", xlab = "Weight", border =
"darkred")
hist(Cars93$Horsepower, breaks = 10, main = "", xlab = "Horsepower",
border = "blue")
Hide
Hide
par(mfrow = c(1,1))
Hide
Hide
shapiro.test(Cars93$Horsepower)
##
## Shapiro-Wilk normality test
##
## data: Cars93$Horsepower
## W = 0.93581, p-value = 0.0001916
# Representación gráfica
par(mfrow = c(1, 2))
hist(log10(Cars93$Horsepower), breaks = 10, main = "", xlab =
"Log10(Horsepower)",
border = "blue")
qqnorm(log10(Cars93$Horsepower), main = "", col = "blue")
qqline(log10(Cars93$Horsepower))
Hide
2.Homocedasticidad
La homocedasticidad implica que la varianza se mantenga constante.
Puede analizarse de forma gráfica representando las observaciones
en un diagrama de dispersión y viendo si mantiene una
homogeneidad en su dispersión a lo largo del eje X. Una forma
cónica es un claro indicativo de falta de homocedasticidad. En
algunos libros se menciona el test de Goldfeld-Quandt o el de Breusch-
Pagan como test de hipótesis para la homocedasticidad en correlación y
regresión.
Tal como muestra el diagrama de dispersión generado al inicio del
ejercicio, sí hay un patrón cónico. Esto debe de tenerse en cuenta si
se utiliza Pearson puesto que viola una de sus condiciones.
Hide
3.Cálculo de correlación
Debido a la falta de homocedasticidad, los resultados generados
por Pearson no son precisos, desde el punto de vista
teórico Spearman o Kendall son más adecuados. Sin embargo, en la
bibliografía emplean Pearson, así que se van a calcular
tanto Pearson como Spearman.
Hide
Hide
Hide
Ambos test muestran una correlación alta (>0.8). Sin embargo para
poder considerar que existe realmente correlación entre las dos
variables es necesario calcular su significancia, de lo contrario podría
deberse al azar.
4.Significancia de la correlación
Por muy alto que sea un coeficiente de correlación, si no es
significativa se ha de considerar inexistente.
Hide
cor.test(x = Cars93$Weight,
y = log10(Cars93$Horsepower),
alternative = "two.sided",
conf.level = 0.95,
method = "pearson")
##
## Pearson's product-moment correlation
##
## data: Cars93$Weight and log10(Cars93$Horsepower)
## t = 13.161, df = 91, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.7256502 0.8699014
## sample estimates:
## cor
## 0.809672
Hide
cor.test(x = Cars93$Weight,
y = log10(Cars93$Horsepower),
alternative = "two.sided",
conf.level = 0.95,
method = "spearman")
##
## Spearman's rank correlation rho
##
## data: Cars93$Weight and log10(Cars93$Horsepower)
## S = 26239, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.8042527
Hide
6.Conclusión
Existe una correlación significativa entre el peso del vehículo y la
potencia de su motor (r=0.8, p-value < 2.2e-16), con un tamaño de
efecto medio-alto ( R2=0.66R2=0.66).
# Se introduce un outlier
a[5] <- 20
b[5] <- 16
datos <- data.frame(a,b)
plot(datos$a, type = "o", lty = 1, pch = 19, col = "firebrick",
ylab = "concentración", main = "Con outlier")
lines(datos$b, type = "o", pch = 19, lty = 1)
legend("topright", legend = c("A", "B"),
col = c("firebrick", "black"), lty = c(1,1), cex = 0.8)
Hide
Hide
# Se elimina el outlier
a <- a[-5]
b <- b[-5]
datos_sin_outlier <- data.frame(a,b)
plot(datos_sin_outlier$a, type = "o", pch = 19, col = "firebrick", ylim
= c(0,20),
ylab = "concentración", main = "Sin outlier")
lines(datos_sin_outlier$b, type = "o", pch = 19, lty = 1)
legend("topright", legend = c("A", "B"), col = c("firebrick", "black"),
lty = c(1,1), cex = 0.8)
Hide
for (i in 1:n) {
# Loop para excluir cada observación y calcular la correlación
valores_jackknife[i] <- cor(matriz[-i, 1], matriz[-i, 2], method =
method)
}
promedio_jackknife <- mean(valores_jackknife)
standar_error <- sqrt(((n - 1)/n)*sum((valores_jackknife-
promedio_jackknife)^2))
bias <- (n - 1) * (promedio_jackknife - cor(matriz[, 1], matriz[, 2],
method = method))
return(list(valores_jackknife = valores_jackknife,
promedio = promedio_jackknife,
se = standar_error,
bias = bias))
}
Hide
correlacion$valores_jackknife
## [1] 0.6409823 0.5394608 0.5410177 0.5414076 -0.1790631
0.5121559
## [7] 0.5504217 0.4528914 0.7237978 0.5316224
Hide
correlacion$se
## [1] 0.697034
Hide
correlacion$bias
## [1] -0.3551246
Hide
Matriz de correlaciones
Cuando se dispone de múltiples variables y se quiere estudiar la
relación entre todas ellas se recurre al cálculo de matrices con el
coeficiente de correlación de cada par de variables (pairwise
correlation). También se generan gráficos de dispersión dos a dos. En
R existen diferentes funciones que permiten realizar este estudio, las
diferencias entre ellas son el modo en que se representan
gráficamente los resultados.
Se quiere estudiar la relación entre el tamaño de diferentes partes de las
flores. Para ello, se dispone del set de datos iris que consta de cuatro
variables numéricas.
Hide
data(iris)
#Se seleccionan únicamente las variables numéricas
datos <- iris[,c(1,2,3,4)]
head(datos)
Hide
library(psych)
multi.hist(x = datos, dcol = c("blue", "red"), dlty = c("dotted",
"solid"),
main = "")
La función corrplot() del paquete corrplot recibe como argumento
la matriz de correlaciones generada por la función cor() y genera
diferentes tipos de heat maps mucho más visuales que la matriz
numérica.
Hide
library(corrplot)
corrplot(corr = cor(x = datos, method = "pearson"), method = "number",
tl.cex = 0.7,number.cex = 0.8, cl.pos = "n")
Otros paquetes permiten representar a la vez los diagramas de
dispersión y los valores de correlación para cada par de variables.
Además de la distribución de cada una de las variables.
Hide
library(psych)
pairs.panels(x = datos, ellipses = FALSE, lm = TRUE, method = "pearson")
La función ggpairs() del paquete GGally basada
en ggplot2 representa los diagramas de dispersión, el valor de la
correlación e incluso interpreta el tipo de variable para que, en caso
de ser categórica, representarla en forma de boxplot.
Hide
library(GGally)
ggpairs(iris, lower = list(continuous = "smooth"),
diag = list(continuous = "bar"), axisLabels = "none")
Correlación parcial
Como se ha explicado, la correlación estudia la relación (lineal o
monotónica) existente entre dos variables. Puede ocurrir que la
relación que muestran dos variables se deba a una tercera variable
que influye sobre las otras dos, a este fenómeno se le conoce
como confounding. Por ejemplo, si se correlaciona el tamaño del pie
de una persona con su inteligencia, se encuentra una correlación
positiva alta. Sin embargo, dicha relación se debe a una tercera
variable que está relacionada con las otras dos, la edad. La
correlación parcial permite estudiar la relación lineal entre dos
variables bloqueando el efecto de una tercera (o más) variables. Si el
valor de correlación de dos variables es distinto al valor de
correlación parcial de esas mismas dos variables cuando se controla
una tercera, significa que la tercera variable influye en las otras dos.
La función en pcor.test() del paquete ppcor permite estudiar
correlaciones parciales.
Ejemplo
library(MASS)
library(ggplot2)
data("Cars93")
#Se emplea el log del precio porque mejora la linealidad
ggplot(data = Cars93, aes(x = Weight, y = log(Price))) +
geom_point(colour = "red4") +
ggtitle("Diagrama de dispersión") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
El gráfico permite intuir que existe una relación lineal entre el peso
de un coche y el logaritmo de su precio.
Hide
library(ppcor)
cor.test(x = Cars93$Weight, y = log(Cars93$Price), method = "pearson")
##
## Pearson's product-moment correlation
##
## data: Cars93$Weight and log(Cars93$Price)
## t = 11.279, df = 91, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6629513 0.8370563
## sample estimates:
## cor
## 0.763544
Hide
Conclusión
La relación lineal existente entre el peso y el logaritmo del precio
está influenciada por el efecto de la variable potencia de motor. Si se
controla el efecto de la potencia, la relación lineal existente es baja
(r=0.4047).
β^1=∑ni=1(xi−x¯¯¯)(yi−y¯¯¯)∑ni=1(xi−x¯¯¯)2=SySxRβ^1=∑i=1n(xi−x¯)
(yi−y¯)∑i=1n(xi−x¯)2=SySxR
β^0=y¯¯¯−β^1x¯¯¯β^0=y¯−β^1x¯
Donde SySy y SxSx son las desviaciones típicas de cada variable
y RR el coeficiente de correlación. β^0β^0 es el valor esperado la
variable YY cuando XX = 0, es decir, la intersección de la recta con el
eje y. Es un dato necesario para generar la recta, pero en ocasiones,
no tiene interpretación práctica (situaciones en las que XX no puede
adquirir el valor 0).
Una recta de regresión puede emplearse para diferentes propósitos
y dependiendo de ellos es necesario satisfacer distintas condiciones.
En caso de querer medir la relación lineal entre dos variables, la
recta de regresión lo va a indicar de forma directa (ya que calcula la
correlación). Sin embargo, en caso de querer predecir el valor de una
variable en función de la otra, no solo se necesita calcular la recta,
sino que además hay que asegurar que el modelo sea bueno.
SE(β^0)2=σ2[1n+x¯¯¯2∑ni=1(xi−x¯¯¯)2]SE(β^0)2=σ2[1n+x¯2∑i=1n(xi−x¯)2]
SE(β^1)2=σ2∑ni=1(xi−x¯¯¯)2SE(β^1)2=σ2∑i=1n(xi−x¯)2
La varianza del error σ2σ2 se estima a partir del Residual Standar
Error (RSE), que puede entenderse como la diferencia promedio que
se desvía la variable respuesta de la verdadera línea de regresión. En
el caso de regresión lineal simple, RSE equivale a:
RSE=1n−2RSS−−−−−−−−−√=1n−2∑i=1n(yi−y^i)−−−−−−−−
−−−−−−−√RSE=1n−2RSS=1n−2∑i=1n(yi−y^i)
Intervalos de confianza
β^0±tα/2dfSE(β^0)β^0±tdfα/2SE(β^0)
β^1±tα/2dfSE(β^1)β^1±tdfα/2SE(β^1)
Cuanto menor es el número de observaciones nn, menor la
capacidad para calcular el error estándar del modelo. Como
consecuencia, la exactitud de los coeficientes de regresión estimados
se reduce. Esto tiene importancia sobretodo en la regresión múltiple.
En R, cuando se genera el modelo de regresión lineal, se devuelve
junto con el valor de la pendiente y la ordenada en el origen el valor
del estadístico tt obtenido para cada uno y los p-
value correspondientes. Esto permite saber, además de la estimación
de β0β0 y β1β1 , si son significativamente distintos de 0. Si se desea
conocer los intervalos de confianza para cada uno de los parámetros
se pueden calcular con la función conint().
RSE=1n−p−1RSS−−−−−−−−−−−−√RSE=1n−p−1RSS
1−∑(yi^−yi)2∑(yi−y¯¯¯)21−∑(yi^−yi)2∑(yi−y¯)2
En los modelos de regresión lineal simple el valor de R2R2 se
corresponde con el cuadrado del coeficiente de correlación de Pearson
(r) entre X e Y, no siendo así en regresión múltiple. Existe una
modificación de R2R2 conocida como R2−ajustadoR2−ajustado que
se emplea principalmente en los modelos de regresión múltiple.
Introduce una penalización cuantos más predictores se incorporan al
modelo. En los modelos lineales simples no se emplea.
Test F: El test F es un test de hipótesis que considera como hipótesis
nula que todos los coeficientes de correlación estimados son cero,
frente a la hipótesis alternativa de que al menos uno de ellos no lo
es. Se emplea en modelos de regresión múltiple para saber si al
menos alguno de los predictores introducidos en el modelo
contribuye de forma significativa. En modelos lineales simples, dado
que solo hay un predictor, el p-value del test F es igual al p-
value del t-test del predictor.
Predicción de valores
y^±tα/2,n−2MSE(1n+(xk−x¯)2∑(xi−x¯2))−−−−−−−−−−−−−−−
−−−−−−√y^±tα/2,n−2MSE(1n+(xk−x¯)2∑(xi−x¯2))
y^±tα/2,n−2MSE(1+1n+(xk−x¯)2∑(xi−x¯)2)−−−−−−−−−−−−−−
−−−−−−−−−−√y^±tα/2,n−2MSE(1+1n+(xk−x¯)2∑(xi−x¯)2)
library(ggplot2)
ggplot(data = mtcars, aes(x = hp, y = mpg)) +
geom_point() +
geom_smooth(method = "lm", se = TRUE, color = "firebrick") +
theme_bw() + labs(x = "", y = "")
−√MSE(1n+(xk−x¯)2∑(xi−x¯2))
Ejemplo
equipos <-
c("Texas","Boston","Detroit","Kansas","St.","New_S.","New_Y.",
"Milwaukee","Colorado","Houston","Baltimore","Los_An.","Chi
cago",
"Cincinnati","Los_P.","Philadelphia","Chicago","Cleveland",
"Arizona",
"Toronto","Minnesota","Florida","Pittsburgh","Oakland","Tam
pa",
"Atlanta","Washington","San.F","San.I","Seattle")
numero_bateos <- c(5659, 5710, 5563, 5672, 5532, 5600, 5518, 5447,
5544, 5598,
5585, 5436, 5549, 5612, 5513, 5579, 5502, 5509, 5421,
5559,
5487, 5508, 5421, 5452, 5436, 5528, 5441, 5486, 5417,
5421)
runs <- c(855, 875, 787, 730, 762, 718, 867, 721, 735, 615, 708, 644,
654, 735,
667, 713, 654, 704, 731, 743, 619, 625, 610, 645, 707, 641,
624, 570,
593, 556)
datos <- data.frame(equipos,numero_bateos,runs)
head(datos)
equipos numero_bateos
<chr> <dbl>
1 Texas 5659
2 Boston 5710
3 Detroit 5563
4 Kansas 5672
5 St. 5532
equipos numero_bateos
<chr> <dbl>
6 New_S. 5600
6 rows
library(ggplot2)
ggplot(data = datos, mapping = aes(x = numero_bateos, y = runs)) +
geom_point(color = "firebrick", size = 2) +
labs(title = 'Diagrama de dispersión', x = 'número de bateos') +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
Hide
cor.test(x = datos$numero_bateos, y = datos$runs, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: datos$numero_bateos and datos$runs
## t = 4.0801, df = 28, p-value = 0.0003388
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.3209675 0.7958231
## sample estimates:
## cor
## 0.610627
confint(modelo_lineal)
## 2.5 % 97.5 %
## (Intercept) -4537.9592982 -1040.5264727
## numero_bateos 0.3139863 0.9471137
Hide
Hide
qqnorm(modelo_lineal$residuals)
qqline(modelo_lineal$residuals)
Hide
shapiro.test(modelo_lineal$residuals)
##
## Shapiro-Wilk normality test
##
## data: modelo_lineal$residuals
## W = 0.96144, p-value = 0.337
Hide
# Test de Breush-Pagan
library(lmtest)
bptest(modelo_lineal)
##
## studentized Breusch-Pagan test
##
## data: modelo_lineal
## BP = 0.01269, df = 1, p-value = 0.9103
library(ggrepel)
library(dplyr)
datos$studentized_residual <- rstudent(modelo_lineal)
ggplot(data = datos, aes(x = prediccion, y = abs(studentized_residual)))
+
geom_hline(yintercept = 3, color = "grey", linetype = "dashed") +
# se identifican en rojo observaciones con residuos studentized
absolutos > 3
geom_point(aes(color = ifelse(abs(studentized_residual) > 3, 'red',
'black'))) +
scale_color_identity() +
#se muestra el equipo al que pertenece la observación atípica
geom_text_repel(data = filter(datos, abs(studentized_residual) > 3),
aes(label = equipos)) +
labs(title="Distribución de los residuos studentized", x="predicción
modelo") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5), legend.position =
"none")
Hide
which(abs(datos$studentized_residual) > 3)
## [1] 7
library(car)
summary(influence.measures(model = modelo_lineal))
## Potentially influential observations of
## lm(formula = runs ~ numero_bateos, data = datos) :
##
## dfb.1_ dfb.nmr_ dffit cov.r cook.d hat
## 2 -0.53 0.54 0.58 1.27_* 0.17 0.22_*
## 7 0.05 -0.04 0.58 0.61_* 0.13 0.03
Hide
influencePlot(model = modelo_lineal)
StudRes Hat
<dbl> <dbl>
2 1.0914283 0.22133381
4 -0.9331751 0.15252728
7 3.0928757 0.03349684
10 -2.0622189 0.06333282
4 rows
Las funciones influence.measures() e influencePlot() detectan la
observación 7 como atípica pero no significativamente influyente. Sí
detectan como influyente la observación que ocupa la segunda
posición. Para evaluar hasta qué punto condiciona el modelo, se
recalcula la recta de mínimos cuadrados excluyendo esta
observación.
Hide
Hide
Conclusión
Dado que se satisfacen todas las condiciones para considerar válido
un modelo de regresión lineal por mínimos cuadrados y que el p-
value indica que el ajuste es significativo, se puede aceptar el modelo
lineal. A pesar de ello, el valor de R 2 no es muy alto por lo que el
número de bateos no es muy buen predictor del número de runs.
par(mfrow = c(1,2))
plot(modelo_lineal)
Hide
par(mfrow = c(1,1))
Apuntes varios
(miscellaneous)
En este apartado recojo comentarios, definiciones y puntualizaciones
que he ido encontrando en diferentes fuentes y que, o bien no he
tenido tiempo de introducir en el cuerpo principal del documento, o
que he considerado mejor mantenerlos al margen como información
complementaria.
Estimación de la varianza de un
modelo lineal por mínimos
cuadrados
Linear Models with R, by Julian J. Faraway
La estimación de la varianza ( σ2σ2) de un modelo lineal obtenido por
mínimos cuadrados es:
σ2=RSSn−pσ2=RSSn−p
El termino Residual Standar Error (RSE), es la raíz cuadrada de σ2σ2:
RSE=RSSn−p−−−−−√RSE=RSSn−p
Identificación de outliers,
observaciones con alto leverage y
observaciones influyentes
Linear Models with R, by Julian J. Faraway
Outlier u observación atípica: Observaciones que no se ajustan
bien al modelo. El valor real de la variable respuesta se aleja mucho
del valor predicho, por lo que su residuo es excesivamente grande.
En una representación bidimensional se corresponde con
desviaciones en el eje YY.
Hide
set.seed(123)
datos <- data.frame(x = 1:10, y = 1:10 + rnorm(10))
modelo_1 <- lm(y ~ x, data = datos)
Dfbetasi=β^−βi^SEβi^Dfbetasi=β^−βi^SEβi^
Hide
library(faraway)
library(ggplot2)
data("savings")
savings$pais <- rownames(savings)
modelo_lineal <- lm(sr ~ pop15 + pop75 + dpi + ddpi, savings)
library(faraway)
library(ggplot2)
data(sexab)
head(sexab)
Hide
csa
<fct>
Abused
NotAbused
2 rows
Hide
Hide
Hide
β^0=y¯¯¯−β^1x¯¯¯β^0=y¯−β^1x¯
en muchos otros casos no existe tal posibilidad, haciendo necesaria
la utilización de algoritmos de optimización. La sencillez del
problema de regresión lineal simple hace que sea un buen ejemplo
para ilustrar cómo se solucionan problemas de optimización.
Además, esta función tiene una propiedad muy interesante que
facilita mucho su optimización, se trata de una función convexa, por
lo que tiene un único mínimo que coincide con el mínimo global.
Los algoritmos de optimización siguen un proceso iterativo en el
que, partiendo de una posición inicial dentro del dominio de la
función, realizan desplazamientos en la dirección correcta hasta
alcanzar el mínimo. Para poder llevar a cabo el proceso se necesita:
La función objetivo a minimizar.
La posición desde la que iniciar la búsqueda.
La distancia (step) que se va a desplazar el algoritmo en cada
iteración de búsqueda. Es importante escoger
un step adecuado en cada escenario. Si es muy pequeño, se
tardará demasiado en llegar al mínimo y, si es demasiado
grande, el algoritmo saltará de una región a otra pasando por
encima del mínimo sin alcanzarlo.
La dirección de búsqueda en la que se produce el
desplazamiento.
La tolerancia: Al tratarse de un algoritmo iterativo, hay que
indicar una regla de parada. Lo idóneo es que el algoritmo se
detenga al encontrar el mínimo, pero como normalmente se
desconoce cuál es, hay que conseguir que se pare lo más cerca
posible. Una forma de cuantificar la proximidad al mínimo es
controlar cuanto desciende el valor de la función entre
iteraciones consecutivas. Si el descenso es muy pequeño,
significa que se encuentra muy cerca del valor. La tolerancia se
define como un valor tal que, si la diferencia en el descenso es
menor o igual, se considera que se ha alcanzado el mínimo (el
algoritmo converge). Una alternativa a calcular la distancia
entre las dos iteraciones es medir la longitud del vector
gradiente en cada iteración. Si su longitud es muy pequeña,
también lo es la distancia al mínimo.
Iteraciones máximas: Si la posición de inicio en la búsqueda
está muy alejada del mínimo de la función y el step es muy
pequeño, se pueden necesitar muchas iteraciones para
alcanzarlo. Para evitar un proceso iterativo excesivamente
largo, se suele establecer un número máximo de iteraciones
permitidas.
J(β0,β1)=∑i=1n(yi−(β0+β1xi))2=∑i=1n(yi−β0−β1xi)2J(β0,β1)=∑i=1n(yi−
(β0+β1xi))2=∑i=1n(yi−β0−β1xi)2
dJd(β1)=2∗12∑i=1n(yi−β0−β1xi)∗−xi=−∑i=1n(yi−β0−β1xi)xidJd(β1)=2
∗12∑i=1n(yi−β0−β1xi)∗−xi=−∑i=1n(yi−β0−β1xi)xi
[−∑ni=1(yi−β0−β1xi)−∑ni=1(yi−β0−β1xi)xi][−∑i=1n(yi−β0−β1xi)
−∑i=1n(yi−β0−β1xi)xi]
1 1.4378876
2 3.9415257
3 2.0448846
4 4.4150870
5 4.7023364
6 0.2277825
6 rows
Véase los valores estimados por la función lm() que aplica la
solución explicita.
Hide
# OPTIMIZACIÓN
#
========================================================================
=====
optimizacion_grad <- function(beta_0 = 0, beta_1 = 0, x, y, t = 0.001,
max_iter = 10000, tolerancia = 1e-10){
for(i in 1:max_iter){
return(list(beta_0 = beta_0,
beta_1 = beta_1,
iteraciones = i,
estimaciones = as.data.frame(na.omit(estimaciones))
)
)
}
resultados <- optimizacion_grad(beta_0 = 10, beta_1 = 10, x = datos$x,
y = datos$y, t = 0.001, max_iter =
10000,
tolerancia = 1e-6)
## [1] "Estimación de beta_0: 2.11765688165228"
## [1] "Estimación de beta_1; 4.98906810875534"
## [1] "Número de iteraciones: 830"
## [1] "Suma de residuos cuadrados: 82.4660264805963"
library(ggplot2)
ggplot(data = resultados$estimaciones,
aes(x = iteracion, y = beta0)) +
geom_path() +
geom_hline(yintercept = modelo_lm$coefficients[1], color = "firebrick")
+
theme_bw() +
ggtitle("Estimación de beta_0")
Hide
ggplot(data = resultados$estimaciones,
aes(x = iteracion, y = beta1)) +
geom_path() +
geom_hline(yintercept = modelo_lm$coefficients[2], color = "firebrick")
+
theme_bw() +
ggtitle("Estimación de beta_1")
Hide
ggplot(data = resultados$estimaciones,
aes(x = iteracion, y = residuos)) +
geom_path() +
theme_bw() +
ggtitle("Residuos del modelo")
for(i in c(1,5,10,100)) {
beta_0 <- round(resultados$estimaciones$beta0[i],3)
beta_1 <- round(resultados$estimaciones$beta1[i],3)
p <- ggplot(data = datos, aes(x = x, y = y)) +
geom_point() +
geom_abline(intercept = beta_0, slope = beta_1, color =
"firebrick") +
ggtitle(paste("iteracion=", i, "Beta0=", beta_0,
"Beta1=",beta_1)) +
theme_bw() +
theme(plot.title = element_text(size = 8))
print(p)
}
Este método está muy influenciado por el tamaño de t. Para valores
altos, la suma de cuadrados residuales puede ser un valor
demasiado grande para que el software empleado lo almacene. Por
ejemplo, este mismo código ejecutado para una muestra de
tamaño n=1000 devuelve error. Las simulaciones que he realizado
parecen indicar que empleando un valor de t aproximadamente
de 1/(10n) se adapta bastante bien.
Hide
n <- 10000
set.seed(123)
x <- runif(n, min = 0, max = 5)
beta0 <- 2
beta1 <- 5
set.seed(123)
epsilon <- rnorm(n, sd = 1)
y <- beta0 + beta1 * x + epsilon
datos2 <- data.frame(x, y)
# OPTIMIZACIÓN
#
========================================================================
=====
optimizacion_grad <- function(beta_0 = 0, beta_1 = 0, x, y, t = 0.001,
max_iter = 10000, tolerancia = 1e-10){
for(i in 1:max_iter){
gradiente <- calc_gradiente(beta_0 = beta_0, beta_1 = beta_1, x = x,
y = y)
return(list(beta_0 = beta_0,
beta_1 = beta_1,
iteraciones = i,
estimaciones = as.data.frame(na.omit(estimaciones))
)
)
}
for(j in 1:epochs){
estimaciones[j, 1] <- j
estimaciones[j, 2] <- beta_0
estimaciones[j, 3] <- beta_1
for(i in 1:length(x)){
}
}
return(list(beta_0 = beta_0,
beta_1 = beta_1,
epochs = j,
estimaciones = estimaciones))
}