El modelo teórico que sugieres ("Valor = B0 + B1(TempAlta) + B2(TempBaja)") es no identificable . Vamos a desgranarlo un poco: En última instancia, sólo hay dos categorías posibles de temperatura, high
y low
. Por tanto, caben dos medios. Pero tiene tres parámetros, B0, B1 y B2. Si B0 fuera $0$ entonces B1 y B2 podrían ser las medias de los dos grupos, pero si B0 no se restringe de esta manera, hay infinitos conjuntos de valores que satisfacerían el modelo. Por ejemplo, imaginemos que los valores medios de high
y low
eran $3$ y $8$ respectivamente. Entonces se podría tener $0$ , $3$ y $8$ o $1$ , $2$ y $7$ o $-1$ , $4$ y $9$ etc. No existe una solución única para las estimaciones de los parámetros (véase también: La codificación cualitativa de variables en la regresión da lugar a "singularidades" ).
Se trata de un problema habitual con las variables explicativas categóricas. Con $k$ grupos (en su caso, 2), sólo puede tener $k$ parámetros. Así que si tienes un intercepto, sólo puedes tener un parámetro más. Hay varias formas de codificación para variables categóricas que se han desarrollado para hacer frente a esto. El más común se denomina "codificación del nivel de referencia". La media del nivel de referencia de su variable se convierte en el intercepto y el otro coeficiente ajustado es la diferencia entre las dos medias. R
utiliza por defecto la codificación a nivel de referencia; debería notarlo en su primer modelo, fit
el intercepto será igual a la media de Value
cuando Temperature
es $\le 55$ . Esta es una forma perfectamente correcta de hacerlo, siempre y cuando entiendas la salida. (Yo me mantendría alejado de fit2
).
Otro problema es que estás convirtiendo una variable continua, Temperature
en un indicador binario. Por lo general, esto no es aconsejable, ya que se desperdicia mucha información y el modelo estará mal especificado. a menos que la verdadera relación sea la siguiente :
Si crees que la pendiente de la relación entre Temperature
y Value
cambios en 55
puede que desee ajustar un modelo por partes, como sugiere @Penguin_Knight. Pero está ajustando sólo el término de interacción, lo que sesgará el modelo. Considérelo:
En su lugar, asegúrese de incluir explícitamente los términos de "efecto principal":
fit3a = lm(Value~Temperature+HighorLow+Temperature:HighorLow)
O utilice R
's taquigrafía, *
para una interacción que incluya los efectos principales (son los mismos):
fit3b = lm(Value~Temperature*HighorLow)
cbind(coef(fit3a),coef(fit3b))
# [,1] [,2]
# (Intercept) 3.291754862 3.291754862
# Temperature -0.005393056 -0.005393056
# HighorLow 4.787570944 4.787570944
# Temperature:HighorLow 0.005136976 0.005136976
Así se obtendrá un modelo mejor especificado:
Si, a priori, esperaba que las pendientes fueran exactamente 0 en ambos grupos, podría realizar una prueba de modelo anidado eliminando los términos de interacción y de pendiente, y si el ajuste no fuera lo suficientemente peor como para sentirse incómodo, podría utilizar la prueba de HighorLow
en el modelo restringido como prueba de su hipótesis principal:
fit4 = lm(Value~HighorLow)
anova(fit4, fit3a)
# Model 1: Value ~ HighorLow
# Model 2: Value ~ Temperature + HighorLow + Temperature:HighorLow
# Res.Df RSS Df Sum of Sq F Pr(>F)
# 1 198 207.59
# 2 196 207.42 2 0.17392 0.0822 0.9211
summary(fit4)
# Call:
# lm(formula = Value ~ HighorLow)
#
# Residuals:
# Min 1Q Median 3Q Max
# -3.2365 -0.6912 -0.0097 0.7112 3.1765
#
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 3.0660 0.1004 30.54 <2e-16 ***
# HighorLow 4.9956 0.1449 34.47 <2e-16 ***
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 1.024 on 198 degrees of freedom
# Multiple R-squared: 0.8572, Adjusted R-squared: 0.8564
# F-statistic: 1188 on 1 and 198 DF, p-value: < 2.2e-16
La ventaja oculta de utilizar esta estrategia es que producirá un ajuste adecuado si sus datos no son como los anteriores. El mismo modelo no estará mal especificado si en su lugar necesita un modelo lineal a trozos. Considere:
set.seed(3633)
N = 200
Temperature = runif(N, min=30, max=80)
Value = 3 + ifelse(Temperature<55, .5*Temperature, 0) +
ifelse(Temperature>=55, 1*Temperature - 27.5, 0) +
rnorm(N, mean=0, sd=4)
fit3c = lm(Value~Temperature+HighorLow+Temperature:HighorLow)
summary(fit3c)
# Call:
# lm(formula = Value ~ Temperature + HighorLow + Temperature:HighorLow)
#
# Residuals:
# Min 1Q Median 3Q Max
# -9.404 -2.779 -0.111 3.335 12.421
#
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 4.51129 2.53585 1.779 0.0768 .
# Temperature 0.46515 0.05724 8.126 4.91e-14 ***
# HighorLow -27.00086 4.28793 -6.297 1.95e-09 ***
# Temperature:HighorLow 0.50498 0.07698 6.560 4.69e-10 ***
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 4.143 on 196 degrees of freedom
# Multiple R-squared: 0.869, Adjusted R-squared: 0.867
# F-statistic: 433.3 on 3 and 196 DF, p-value: < 2.2e-16