Un vector de variables aleatorias \(\mathbf{Y}= \left(y_1,y_2,\dots, y_n\right)\) sigue un modelo de regresión lineal si:
\[\mathbf{Y} \cong \mathbf{N_n} \left(\mathbf{X} \beta, \mathbf{I_n} \right)\]
donde:
\(\mathbf{X}\) es una matriz de dimensión \(n\times p\).
\(\beta\) es un vector de parámetros \(p\)-dimensional.
\(\mathbf{I_{n}}\) es la matriz identidad de orden \(n\).
En este documento mostraremos como es posible utilizar R para estimar el modelo de regresión (coeficientes, matrices de covarianzas, errores estándar, coeficiente de determinación, etc.) utilizando álgebra matricial y aplicando directamente las expresiones algebraicas que pueden deducirse de la estimación por mínimos cuadrados. Veremos además que dicha estimación puede realizarse directamente mediante el uso de la función lm()
.
Utilizaremos los siguientes archivos de datos para ilustrar los modelos de regresión con R:
Veamos el contenido de estos ficheros:
A continuación se muestra un conjunto de datos correspondientes a un estudio experimental cuyo objetivo fue evaluar el efecto que tiene la velocidad de mezclado (\(x\)) sobre el porcentaje de impurezas (\(y\)) en una pintura producida mediante un proceso químico.
ejemplo1
## velocidad impurezas
## 1 20 8.4
## 2 22 9.5
## 3 24 11.8
## 4 26 10.4
## 5 28 13.3
## 6 30 14.8
## 7 32 13.2
## 8 34 14.7
## 9 36 16.4
## 10 38 16.5
## 11 40 18.9
## 12 42 18.5
plot(ejemplo1)
En este caso se estudia la eficiencia térmica de un reactor químico (en %) como función de la tasa de flujo en lb/h de dos gases (fluidizante y flotante), apertura de la boquilla (en mm) y temperatura de entrada del gas flotante (en ºF). Mostramos a continuación los 10 primeros casos del archivo:
head(ejemplo7,10)
## eficienciaTermica tasaFlujoGas1 tasaFlujoGas2 aperturaBoq tempGas
## 1 47.83 124.17 134.07 23.32 210.11
## 2 59.51 149.46 142.21 41.82 229.67
## 3 50.38 131.65 146.62 21.14 231.10
## 4 53.24 139.49 136.16 45.79 206.03
## 5 47.26 113.03 125.41 41.51 222.67
## 6 50.52 134.57 165.84 32.42 219.59
## 7 50.78 140.92 128.17 27.95 223.25
## 8 54.59 172.06 139.52 34.27 211.76
## 9 59.80 151.36 152.54 57.09 235.86
## 10 48.90 136.56 91.19 34.42 216.78
plot(ejemplo7)
Construimos las matrices X e Y:
Y= ejemplo1$impurezas
X= cbind(1,ejemplo1$velocidad)
Y
## [1] 8.4 9.5 11.8 10.4 13.3 14.8 13.2 14.7 16.4 16.5 18.9 18.5
X
## [,1] [,2]
## [1,] 1 20
## [2,] 1 22
## [3,] 1 24
## [4,] 1 26
## [5,] 1 28
## [6,] 1 30
## [7,] 1 32
## [8,] 1 34
## [9,] 1 36
## [10,] 1 38
## [11,] 1 40
## [12,] 1 42
Calculamos el estimador de \(\beta\) utilizando directamente el cálculo matricial:
\[ \hat{\beta} = \left(X^{t}X\right)^{-1}X^{t}Y\]
(la inversa de una matriz A en R se calcula mediante solve(A)
, la traspuesta mediante t(A)
, y el producto de dos matrices mediante el operador %*%
)
solve(t(X)%*%X)%*%t(X)%*%Y
## [,1]
## [1,] -0.28928
## [2,] 0.45664
En R la función lm()
permite obtener directamente de manera muy simple el estimador de \(\beta\). Podemos comprobar que se obtiene el mismo resultado:
lm(impurezas~velocidad,data=ejemplo1)
##
## Call:
## lm(formula = impurezas ~ velocidad, data = ejemplo1)
##
## Coefficients:
## (Intercept) velocidad
## -0.289 0.457
Podemos dibujar la recta de regresión mediante el comando abline()
:
recta=lm(impurezas~velocidad,data=ejemplo1)
plot(ejemplo1)
abline(recta,col="red",lwd=2)
La varianza residual se estima del modo que se muestra a continuación, donde el término \(X_i\) se refiere a la fila \(i\)-ésima de la matriz \(\mathbf{X}\):
\[\hat{\sigma}^{2}=\frac{1}{n-p}\sum_{i=1}^{n}\left(y_{i}-\hat{y_{i}}\right)^{2}=\frac{1}{n-p}\sum_{i=1}^{n}\left(y_{i}-X_{i}\hat{\beta}\right)^{2}=\frac{1}{n-p}\left(\mathbf{Y-X}\hat{\beta}\right)^{t}\left(\mathbf{Y-X}\hat{\beta}\right)\]
En esta ecuación el valor de \(p\) corresponde al número de parámetros del modelo. En el caso de la regresión lineal simple se tiene que \(p=2\) (hay dos parámetros, \(\beta_0\) y \(\beta_1\)).
Determinamos en primer lugar los valores de \(n\), \(p\) y \(b=\hat{\beta}\):
b=solve(t(X)%*%X)%*%t(X)%*%Y
n=length(Y)
p=length(b)
R nos permite ahora hacer el cálculo de \(\hat{\sigma}^2\) de las dos formas:
(S2=t(Y-X%*%b)%*%(Y-X%*%b)/(n-p))
## [,1]
## [1,] 0.84514
(S2=sum((Y-X%*%b)^2)/(n-p))
## [1] 0.84514
Obviamente obtenemos el mismo valor.
Es la desviación típica residual (raíz cuadrada de la varianza residual): \(\hat{\sigma}=\sqrt{\hat{\sigma}^2}\)
(Se=sqrt(S2))
## [1] 0.91932
Esta matriz es de la forma:
\[\textrm{Var}\left(\hat{\beta}\right)=\hat{\sigma}^{2}\left(X^{t}X\right)^{-1}\]
y puede calcularse mediante:
(V_b=S2*solve(t(X)%*%X))
## [,1] [,2]
## [1,] 1.490326 -0.0458032
## [2,] -0.045803 0.0014775
Es la raiz cuadrada de la diagonal de la matriz anterior:
sqrt(diag(V_b))
## [1] 1.220789 0.038439
En un modelo de regresión, la variabilidad total (VT) presente en la variable Y puede descomponerse en la variabilidad explicada (VE) por el modelo de regresión y la variabilidad no explicada o residual (VR):
\[\underset{(VT)}{\sum_{i=1}^{n}\left(y_{i}-\overline{y}\right)^{2}}=\underset{\left(VE\right)}{\sum_{i=1}^{n}\left(\hat{y}_{i}-\overline{y}\right)^{2}}+\underset{\left(VR\right)}{\sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}}\]
siendo los \(\hat{y}_{i}\) los valores predichos por el modelo. Matricialmente:
\[\sum_{i=1}^{n}\left(y_{i}-\overline{y}\right)^{2}= ||\mathbf{Y-1}\overline{Y}||^{2}\]
\[\sum_{i=1}^{n}\left(\hat{y}_{i}-\overline{y}\right)^{2}= ||\mathbf{X}\hat{\beta}-\mathbf{1}\overline{Y}||^{2} \]
\[\sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}= ||\mathbf{Y-}\mathbf{X}\hat{\beta}||^{2} \]
Estos términos pueden calcularse sin dificultad con R.
\[||\mathbf{Y-1}\overline{Y}||^{2}=\left(\mathbf{Y-1}{\overline{Y}}\right)^{t}\left(\mathbf{Y-1}\overline{Y}\right)\]
(VT=t(Y-mean(Y))%*%(Y-mean(Y)))
## [,1]
## [1,] 127.73
\[||\mathbf{X}\hat{\beta}-\mathbf{1}\overline{Y}||^{2}=\left(\mathbf{X}\hat{\beta}-\mathbf{1}\overline{Y}\right)^{t}\left(\mathbf{X}\hat{\beta}-\mathbf{1}\overline{Y}\right)\]
(VE=t(X%*%b-mean(Y))%*%(X%*%b-mean(Y)))
## [,1]
## [1,] 119.28
\[||\mathbf{Y-}\mathbf{X}\hat{\beta}||^{2}=\left(\mathbf{Y-}\mathbf{X}\hat{\beta}\right)^{t}\left(\mathbf{Y-}\mathbf{X}\hat{\beta}\right)\]
(VR=t(Y-X%*%b)%*%(Y-X%*%b))
## [,1]
## [1,] 8.4514
El coeficiente de determinación se define como la proporción de la variabilidad total que es explicada por el modelo de regresión:
\[R^2=\frac{VE}{VT}\]
Puede obtenerse fácilmente a partir de las expresiones calculadas anteriormente:
(R2=VE/VT)
## [,1]
## [1,] 0.93383
El coeficiente de determinación \(R^2\) puede expresarse como: \[R^{2}=\frac{VE}{VT}=1-\frac{VR}{VT}\] El coeficiente de determinación corregido se define de manera similar mediante: \[\tilde{R}^{2}=1-\frac{VR/\left(n-p\right)}{VT/\left(n-1\right)}=1-\frac{n-1}{n-p}\frac{VR}{VT}=1-\frac{n-1}{n-p}\left(1-R^{2}\right)=\frac{n-1}{n-p}\left(R^{2}-\frac{p-1}{n-p}\right)\]
(R2.corregido=1-(1-R2)*(n-1)/(n-p))
## [,1]
## [1,] 0.92722
Es el contraste de hipótesis de la forma:
\[H_0:\beta_1=0\]
que de forma matricial puede expresarse como:
\[H_0:\left(\begin{array}{cc} 0 & 1\end{array}\right)\left(\begin{array}{c} \beta_{0}\\ \beta_{1} \end{array}\right)=0\]
Este es un contraste lineal de la forma:
\[H_0:\mathbf{A\beta}=0\]
Cuando \(H_0\) es cierta el test estadístico:
\[F=\frac{1}{q\hat{\sigma}^{2}}\hat{\beta}^{t}\mathbf{A}^{t}\left(\mathbf{A}\left(\mathbf{X}^{t}\mathbf{X}\right)^{-1}\mathbf{A}^{t}\right)^{-1}\mathbf{A\hat{\beta}}\]
(siendo \(q\) el número de filas de la matriz \(\mathbf{A}\)) sigue una distribución \(F\) de Fisher-Snedecor con \(q\) y \(n-p\) grados de libertad. El p-valor del contraste es
\[p-valor=P\left(F_{q,n-q}>F_{obs}\right)=1-P\left(F_{q,n-q} \le F_{obs}\right)\]
siendo \(F_{obs}\) el valor observado del test estadístico \(F\).
A=matrix(c(0,1),byrow=TRUE,nrow=1)
q=nrow(A)
F.obs=(1/(q*S2))*t(b)%*%t(A)%*%solve(A%*%solve(t(X)%*%X)%*%t(A))%*%A%*%b
F.obs
## [,1]
## [1,] 141.13
p.valor=1-pf(F.obs,q,n-p)
p.valor
## [,1]
## [1,] 3.2112e-07
Nota: el valor del test estadístico \(F_{obs}\) para el contraste de la regresión puede obtenerse también como:
\[F_{obs}=\frac{VE/(p-1)}{VR/(n-p)}\]
En efecto:
(VE/(p-1))/(VR/(n-p))
## [,1]
## [1,] 141.13
R nos permite obtener todos los resultados anteriores de una manera más sencilla aplicando la función summary()
al ajuste conseguido mediante lm()
:
summary(recta)
##
## Call:
## lm(formula = impurezas ~ velocidad, data = ejemplo1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.183 -0.543 -0.323 0.833 1.390
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.2893 1.2208 -0.24 0.82
## velocidad 0.4566 0.0384 11.88 3.2e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.919 on 10 degrees of freedom
## Multiple R-squared: 0.934, Adjusted R-squared: 0.927
## F-statistic: 141 on 1 and 10 DF, p-value: 3.21e-07
La función anova()
presenta el análisis de la varianza con la descomposición de la variabilidad total en sus fuentes de variación:
anova(recta)
## Analysis of Variance Table
##
## Response: impurezas
## Df Sum Sq Mean Sq F value Pr(>F)
## velocidad 1 119.3 119.3 141 3.2e-07 ***
## Residuals 10 8.5 0.8
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Asimismo, la función confint()
permite obtener de manera muy simple intervalos de confianza para los parámetros de la regresión:
confint(recta)
## 2.5 % 97.5 %
## (Intercept) -3.0094 2.43081
## velocidad 0.3710 0.54229
Construimos las matrices X e Y a partir de los datos del dataframe ejemplo7
Y= ejemplo7[,1]
X= as.matrix(cbind(b0=1,ejemplo7[,2:5]))
head(Y)
## [1] 47.83 59.51 50.38 53.24 47.26 50.52
head(X)
## b0 tasaFlujoGas1 tasaFlujoGas2 aperturaBoq tempGas
## [1,] 1 124.17 134.07 23.32 210.11
## [2,] 1 149.46 142.21 41.82 229.67
## [3,] 1 131.65 146.62 21.14 231.10
## [4,] 1 139.49 136.16 45.79 206.03
## [5,] 1 113.03 125.41 41.51 222.67
## [6,] 1 134.57 165.84 32.42 219.59
Calculamos el estimador de \(\beta\) utilizando directamente cálculo matricial:
solve(t(X)%*%X)%*%t(X)%*%Y
## [,1]
## b0 7.522869
## tasaFlujoGas1 0.052898
## tasaFlujoGas2 0.034512
## aperturaBoq 0.153457
## tempGas 0.124906
Calculamos el estimador de \(\beta\) utilizando la función lm()
de R:
lm(eficienciaTermica~tasaFlujoGas1+tasaFlujoGas2+aperturaBoq+tempGas,data=ejemplo7)
##
## Call:
## lm(formula = eficienciaTermica ~ tasaFlujoGas1 + tasaFlujoGas2 +
## aperturaBoq + tempGas, data = ejemplo7)
##
## Coefficients:
## (Intercept) tasaFlujoGas1 tasaFlujoGas2 aperturaBoq tempGas
## 7.5229 0.0529 0.0345 0.1535 0.1249
Podemos representar gráficamente el plano de regresión de la variable respuesta frente a dos variables explicativas:
library(scatterplot3d)
attach(ejemplo7)
s3d <-scatterplot3d(tasaFlujoGas1,tasaFlujoGas2,eficienciaTermica, pch=16, highlight.3d=TRUE,
type="h", main="3D Scatterplot")
fit <- lm(eficienciaTermica ~ tasaFlujoGas1+tasaFlujoGas2)
s3d$plane3d(fit)
detach(ejemplo7)
Utilizando el paquete rgl
es posible mover una imagen 3d en el espacio mediante la sintaxis:
attach(ejemplo7)
library(rgl)
plot3d(tasaFlujoGas1,tasaFlujoGas2,eficienciaTermica, col="red",size=3)
detach(ejemplo7)
varianza residual, errores estándar de los estimadores, contrastes, … Utilizamos directamente la función summary()
de R:
regmult=lm(eficienciaTermica~tasaFlujoGas1+tasaFlujoGas2+aperturaBoq+tempGas,data=ejemplo7)
summary(regmult)
##
## Call:
## lm(formula = eficienciaTermica ~ tasaFlujoGas1 + tasaFlujoGas2 +
## aperturaBoq + tempGas, data = ejemplo7)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.919 -1.459 0.126 1.223 7.772
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.5229 3.0454 2.47 0.0150 *
## tasaFlujoGas1 0.0529 0.0127 4.17 5.9e-05 ***
## tasaFlujoGas2 0.0345 0.0109 3.18 0.0019 **
## aperturaBoq 0.1535 0.0282 5.44 3.0e-07 ***
## tempGas 0.1249 0.0176 7.10 1.1e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.77 on 115 degrees of freedom
## Multiple R-squared: 0.729, Adjusted R-squared: 0.719
## F-statistic: 77.3 on 4 and 115 DF, p-value: <2e-16
Podemos además calcular intervalos de confianza para los parámetros:
confint(regmult)
## 2.5 % 97.5 %
## (Intercept) 1.490609 13.555129
## tasaFlujoGas1 0.027774 0.078023
## tasaFlujoGas2 0.012985 0.056039
## aperturaBoq 0.097622 0.209292
## tempGas 0.090058 0.159753
© 2016 Angelo Santana, Carmen N. Hernández, Departamento de Matemáticas ULPGC