Comenzamos por cargar nuestros datos:
Datos <- read.csv("ejemplo3RLM.csv", header=TRUE )
summary(Datos)
## y X1c X2
## Min. :-2.1 Length:300 Min. :-1.6
## 1st Qu.: 3.8 Class :character 1st Qu.: 1.8
## Median : 5.5 Mode :character Median : 2.9
## Mean : 5.7 Mean : 3.1
## 3rd Qu.: 7.5 3rd Qu.: 4.3
## Max. :16.0 Max. : 9.5
str(Datos)
## 'data.frame': 300 obs. of 3 variables:
## $ y : num 3.25 4.23 9.58 5.11 5.34 ...
## $ X1c: chr "A1" "A1" "A1" "A1" ...
## $ X2 : num 1.88 2.54 6.12 3.14 3.26 ...
notamos que la variable x1c
no es una variable continua.
Para darnos una mejor idea sobre nuestros datos veamos el siguiente
gráfico
library(GGally)
ggpairs(data=Datos, title="Datos", aes(color=X1c))
donde vemos que nuestra variable x1c
es categórica de
tres niveles; vemos también un cierto comportamiento lineal entre la
variable x2
y y
para los distintos niveles de
x1c
. Asimismo, parece ser que las medias de los distintos
grupos son distintas.
R
siempre considera como nivel de referencia el primer
nivel guardado en el metadato de etiquetas, no obstante, la variable
categórica no ha sido especificada como del tipo factor:
levels(Datos$X1c)
## NULL
es decir, R
no reconoce que x1c
sea una
variable categórica. Para declarar que dicha variable sea de tipo factor
escribimos:
Datos$X1c <- factor(Datos$X1c)
levels(Datos$X1c)
## [1] "A1" "A2" "A3"
Graficamos el comportamiento de x2
con y
distinguiendo cada uno de los grupos:
with(Datos, plot(X2, y, col=c("red", "brown", "blue")[Datos[,c("X1c")]] ))
legend("topleft", levels(Datos[,c("X1c")]), col=c("red", "brown", "blue"), pch = c(0,0,0), pt.cex=1.5, cex = .9, y.intersp = 1.3 , bty="n")
El modelo que se ajusta por default en R
incluyendo sólo
las dos variables X1c
y X2
es: \(E(y;x)=\beta_0+\beta_1A_2+\beta_2A_3+\beta_3
x_2\). Procedemos a ajustar el modelo
fit <- lm(y ~ X1c + X2, data=Datos)
summary(fit)
##
## Call:
## lm(formula = y ~ X1c + X2, data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.27765 -0.06051 0.00333 0.06529 0.26148
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.50534 0.01385 36.5 <2e-16 ***
## X1cA2 1.31309 0.01405 93.4 <2e-16 ***
## X1cA3 0.49956 0.01400 35.7 <2e-16 ***
## X2 1.49718 0.00304 491.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.099 on 296 degrees of freedom
## Multiple R-squared: 0.999, Adjusted R-squared: 0.999
## F-statistic: 8.16e+04 on 3 and 296 DF, p-value: <2e-16
Analicemos la interpretación del modelo con estos parámetros. Después regresaremos a la prueba asociada a la tabla ANOVA.
Aquí \(E(y;x1c, x2)=\beta_0+\beta_1A_2+\beta_2A_3+\beta_3 x_2\) con el nivel de referencia igual a A1. Además notar que en este caso, si consideramos que x1c toma el valor del nivel A1, entonces el modelo para \(E(Y;x1c=A1,x2)\) es
\[ E(Y;x1c=A1,x_2)=\beta_0+\beta_1(0)+\beta_2(0)+\beta_3x_2=\beta_0+\beta_3x_2 \] para nivel A2: \[ E(Y;x1c=A2,x_2)=\beta_0+\beta_1(1)+\beta_2(0)+\beta_3x_2=(\beta_0+\beta_1)+\beta_3x_2 \] para nivel A3:
\[ E(Y;x1c=A3,x_2)=\beta_0+\beta_1(0)+\beta_2(1)+\beta_3x_2=(\beta_0+\beta_2)+\beta_3x_2 \] Es decir, con este modelo se considera que la \(E(Y;x1c,x2)\) es una recta en función del valor de x2 para cada nivel, con diferente intercepto pero misma pendiente.
Otras formas de definir el mismo modelo en R
(cuestiones
computacionales) indicando las 2 variables dicótomicas (niveles) que
deben entrar al modelo
fitAlt <- lm(y ~ I(X1c=="A2") + I(X1c=="A3") + X2, data=Datos)
summary(fitAlt)
##
## Call:
## lm(formula = y ~ I(X1c == "A2") + I(X1c == "A3") + X2, data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.27765 -0.06051 0.00333 0.06529 0.26148
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.50534 0.01385 36.5 <2e-16 ***
## I(X1c == "A2")TRUE 1.31309 0.01405 93.4 <2e-16 ***
## I(X1c == "A3")TRUE 0.49956 0.01400 35.7 <2e-16 ***
## X2 1.49718 0.00304 491.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.099 on 296 degrees of freedom
## Multiple R-squared: 0.999, Adjusted R-squared: 0.999
## F-statistic: 8.16e+04 on 3 and 296 DF, p-value: <2e-16
donde I()
es una función indicadora.
Podemos cambiar el nivel de referencia que tiene por default
R
. Aquí hay que obtener de nuevo las expresiones de \(E(Y;x1c=A1,x_2), E(Y;x1c=A2,x_2)\) y \(E(Y|;x1c=A3,x_2)\)
# Indicamos que el nivel de referencia para el modelo
# sera A3 en vez del A1:
fitAlt2 <- lm(y ~ relevel(X1c, "A3") + X2, data=Datos)
summary(fitAlt2)
##
## Call:
## lm(formula = y ~ relevel(X1c, "A3") + X2, data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.27765 -0.06051 0.00333 0.06529 0.26148
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.00490 0.01398 71.9 <2e-16 ***
## relevel(X1c, "A3")A1 -0.49956 0.01400 -35.7 <2e-16 ***
## relevel(X1c, "A3")A2 0.81353 0.01407 57.8 <2e-16 ***
## X2 1.49718 0.00304 491.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.099 on 296 degrees of freedom
## Multiple R-squared: 0.999, Adjusted R-squared: 0.999
## F-statistic: 8.16e+04 on 3 and 296 DF, p-value: <2e-16
o alternativamente
fitAlt3 <- lm(y ~ I(X1c=="A1") + I(X1c=="A2") + X2, data=Datos)
summary(fitAlt3)
##
## Call:
## lm(formula = y ~ I(X1c == "A1") + I(X1c == "A2") + X2, data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.27765 -0.06051 0.00333 0.06529 0.26148
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.00490 0.01398 71.9 <2e-16 ***
## I(X1c == "A1")TRUE -0.49956 0.01400 -35.7 <2e-16 ***
## I(X1c == "A2")TRUE 0.81353 0.01407 57.8 <2e-16 ***
## X2 1.49718 0.00304 491.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.099 on 296 degrees of freedom
## Multiple R-squared: 0.999, Adjusted R-squared: 0.999
## F-statistic: 8.16e+04 on 3 and 296 DF, p-value: <2e-16
podemos trabajar de manera directa sobre los niveles:
# El efecto de la función relevel:
# Niveles dados por default
levels(Datos$X1c)
## [1] "A1" "A2" "A3"
# Cambiamos que A3 sea el nivel de referencia
Datos$X1c <- relevel(Datos$X1c, "A3")
levels(Datos$X1c)
## [1] "A3" "A1" "A2"
# Podemos especificar explicitamente los niveles y el orden
Datos$X1c <- factor(Datos$X1c, levels=c("A1","A2","A3"))
levels(Datos$X1c)
## [1] "A1" "A2" "A3"
Regresamos al análisis del modelo.
summary(fit)
##
## Call:
## lm(formula = y ~ X1c + X2, data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.27765 -0.06051 0.00333 0.06529 0.26148
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.50534 0.01385 36.5 <2e-16 ***
## X1cA2 1.31309 0.01405 93.4 <2e-16 ***
## X1cA3 0.49956 0.01400 35.7 <2e-16 ***
## X2 1.49718 0.00304 491.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.099 on 296 degrees of freedom
## Multiple R-squared: 0.999, Adjusted R-squared: 0.999
## F-statistic: 8.16e+04 on 3 and 296 DF, p-value: <2e-16
Observemos que con la prueba asociada a la tabla ANOVA, se puede concluir que con una significancia de .05, que se rechaza \(H_0\) en el contraste
\[ H_0: \beta_1=0 \ \ y \ \ \beta_2=0 \ \ y \ \ \beta_3=0\ \ vs \ \ H_a: \beta_1\neq0 \ \ o\ \ \beta_2\neq0 \ \ o\ \ \beta_3\neq0 \] Además, si analizamos la prueba t, para el coeficiente \(\beta_3\), asociado a X2, podemos observar que se rechaza \(H_0\) en el contraste
\[ H_0: \beta_3=0 \ \ vs\ \ H_a: \beta_3 \neq 0 \]
Esto nos indicaría que una vez incluida la variable categórica X1c en el modelo, la variable X2 está agregando información. Para analizar si la variable X1c agrega información dado que el modelo incluye a X2, debemos contrastar
\[ H_0: \beta_1=0 \ \ y \ \ \beta_2=0 \ \ vs\ \ H_a: \beta_1\neq0 \ \ o\ \ \beta_2\neq0 \]
para lo cual:
# Opcion 1, usando multcomp
library(multcomp)
K <- matrix(c(0,1,0,0,
0,0,1,0), ncol=4, nrow=2, byrow=TRUE)
m <- c(0,0)
summary(glht(fit, linfct=K, rhs=m), test=Ftest())
##
## General Linear Hypotheses
##
## Linear Hypotheses:
## Estimate
## 1 == 0 1.31
## 2 == 0 0.50
##
## Global Test:
## F DF1 DF2 Pr(>F)
## 1 4442 2 296 1.76e-221
Se observa que se rechaza \(H_0\), entonces la variable X1c nos proporciona información para modelar \(E(Y;x)\) aún cuando en el modelo ya está la variable X2.
# Opcion 2, usando anova con modelos reducidos
fitred <- lm(y ~ X2, data=Datos)
anova(fitred, fit)
## Analysis of Variance Table
##
## Model 1: y ~ X2
## Model 2: y ~ X1c + X2
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 298 90.0
## 2 296 2.9 2 87.1 4442 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Opcion 4, usar directamente la función Anova en librería car
library(car)
Anova(fit, type="II")
## Anova Table (Type II tests)
##
## Response: y
## Sum Sq Df F value Pr(>F)
## X1c 87 2 4442 <2e-16 ***
## X2 2371 1 241851 <2e-16 ***
## Residuals 3 296
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Notar que lo anterior sólo se vale cuando la variable categórica aparece en el modelo sólo a través de sus k-1 variables dicotómicas (no hay interacciones entre variables).
En cualquier caso se está rechazando la hipótesis nula.
summary(fit)
##
## Call:
## lm(formula = y ~ X1c + X2, data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.27765 -0.06051 0.00333 0.06529 0.26148
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.50534 0.01385 36.5 <2e-16 ***
## X1cA2 1.31309 0.01405 93.4 <2e-16 ***
## X1cA3 0.49956 0.01400 35.7 <2e-16 ***
## X2 1.49718 0.00304 491.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.099 on 296 degrees of freedom
## Multiple R-squared: 0.999, Adjusted R-squared: 0.999
## F-statistic: 8.16e+04 on 3 and 296 DF, p-value: <2e-16
Retomando la información sobre nuestro modelo, si analizamos la prueba t, para el coeficiente \(\beta_1\), se rechaza \(H_0\). Aquí el contraste es
\[ H_0: \beta_1=0 \ \ vs\ \ H_a: \beta_1 \neq 0 \]
Esto nos indica, que condicionar en un valor fijo de X2, la esperanza de Y es diferente entre el nivel A2 y el A1 (de referencia). De manera análoga para el coeficiente \(\beta_{2}\), donde al condicionar en un valor fijo de \(X_2\), la esperanza de \(Y\) es diferente entre el nivel A3 y el A1 (de referencia)
Con base en lo anterior, parece que no podríamos reducir el modelo, todos los coeficientes parecen significativos.
summary(fit)
##
## Call:
## lm(formula = y ~ X1c + X2, data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.27765 -0.06051 0.00333 0.06529 0.26148
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.50534 0.01385 36.5 <2e-16 ***
## X1cA2 1.31309 0.01405 93.4 <2e-16 ***
## X1cA3 0.49956 0.01400 35.7 <2e-16 ***
## X2 1.49718 0.00304 491.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.099 on 296 degrees of freedom
## Multiple R-squared: 0.999, Adjusted R-squared: 0.999
## F-statistic: 8.16e+04 on 3 and 296 DF, p-value: <2e-16
\(R^2\): el coeficiente de determinación nos indica que se está explicando el 99.9% de la variabilidad observada en Y a través del modelo que incluye ambas variables X1c y X2: \(E(y;X1c, X2)=\beta_0+\beta_1A_2+\beta_2A_3+\beta_3x_2\).
Además, \(\beta_1\) se puede interpretar como: condicionado en un valor fijo de \(X_2\), el promedio de la variable Y aumenta en 1.31 unidades al comparar el nivel A2 contra el A1. (mayor esperanza en nivel A2 contra nivel A1) Recordar que nivel A1 es el de referencia en este modelo. Esta interpretación se obtiene al comparar
\[ E(Y;A2, X2)-E(Y;A1, X2)=\beta_0+\beta_1+\beta_3x_2-(\beta_0+\beta_3x_2)=\beta_1 \]
\(\beta_2\) se puede interpretar como: condicionado en un valor fijo de X2, el promedio de la variable Y aumenta en .5 unidades al comparar el nivel A3 contra el A1.
\(\beta_3\) se puede interpretar como: condicionado en un nivel fijos de la variable X1c, el promedio de la variable Y aumenta en 1.5 unidades al aumentar en una unidad la variable X2.
¿Cómo se comparan los niveles A2 y A3, dado un valor fijo de X2?
\(E(Y;A2, X2)=\beta_o+\beta_1+\beta_3X_2\)
\(E(Y;A3, X2)=\beta_o+\beta_2+\beta_3X_2\)
\(E(Y;A3, X2)-E(Y;A2, X2)=\beta_2-\beta_1\)
Por ejemplo si se tiene interés en contrastar
\[ H_0:E(Y;A2, X2) =E(Y;A3, X2)\ \ vs \ \ H_a:E(Y;A2, X2)\neq E(Y;A3, X2) \]
Las hipótesis se pueden escribir como \(H_0:\beta_2-\beta_1=0 \ \ vs \ \ H_a:\beta_2-\beta_1\neq0\), donde se puede usar multcomp
library(multcomp)
K <- matrix(c(0,-1,1,0), ncol=4, nrow=1, byrow=TRUE)
m <- c(0)
summary(glht(fit, linfct=K, rhs=m), test=Ftest())
##
## General Linear Hypotheses
##
## Linear Hypotheses:
## Estimate
## 1 == 0 -0.814
##
## Global Test:
## F DF1 DF2 Pr(>F)
## 1 3343 1 296 2.55e-163
summary(glht(fit, linfct=K, rhs=m))
##
## Simultaneous Tests for General Linear Hypotheses
##
## Fit: lm(formula = y ~ X1c + X2, data = Datos)
##
## Linear Hypotheses:
## Estimate Std. Error t value Pr(>|t|)
## 1 == 0 -0.8135 0.0141 -57.8 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)
Se rechaza la igualdad de medias, es decir, dado un valor de X2, la esperanza de Y es diferente entre los niveles A3 y A2 De hecho, la esperanza disminuye en .8135 unidades al comparar el nivel A3 contra el A2.
Para visualizar resultados del modelo \(E(y;X1c,X2)=\beta_0+\beta_1A_2+\beta_2A_3+\beta_3x_2\), recordar que en este caso dicho modelo se relaciona con tres rectas, una por nivel:
Es decir, como función de X2, son tres rectas que tienen diferente intercepto pero misma pendiente b3. Para ello
# Accedemos a los coeficiente betas
fit$coefficients
## (Intercept) X1cA2 X1cA3 X2
## 0.51 1.31 0.50 1.50
Código para graficar las rectas
fA1 <- function(X2) {fit$coefficients[1] + fit$coefficients[4] * X2}
fA2 <- function(X2) {fit$coefficients[1] + fit$coefficients[2] +
fit$coefficients[4] * X2}
fA3 <- function(X2) {fit$coefficients[1] + fit$coefficients[3]+
fit$coefficients[4] * X2}
with(Datos, plot(X2, y, col=c("red", "green", "blue")[Datos[,2]]))
legend("topleft", levels(Datos[,2]), col=c("red", "green", "blue"),
pch=c(0,0,0), pt.cex=1.5, cex=0.9, y.intersp=1.4,
bty="n")
curve(fA1, from=min(Datos$X2), to=max(Datos$X2),
col="red", add=T)
curve(fA2, from = min(Datos$X2), to=max(Datos$X2),
col="green", add=T)
curve(fA3, from=min(Datos$X2), to=max(Datos$X2),
col="blue", add=T)