4 votos

Predecir un resultado en función de si una variable está por encima o por debajo de un umbral

Quiero crear un modelo de regresión lineal para predecir una salida que utilice dos coeficientes diferentes basados en algún umbral dentro de los datos. Por ejemplo: df :

Value   Temperature
8.2     70
3.2     51
5.8     54
7.2     61

etc. Para estos datos, quiero averiguar cómo hacer el siguiente modelo:

Value = B0 + B1(HighTemp) + B2(LowTemp)

Donde B1 es 0 si la temperatura es inferior a 55, y B2 es 0 si la temperatura es superior a 55. He probado lo siguiente:

fit  = lm(Value ~ I(Temperature>55), data=df) 
fit2 = lm(Value ~ Temperature * I(Temperature>55), data=df) 

fit sólo me da un coeficiente para cuando la temperatura es superior a 55, y fit2 da una salida que no entiendo del todo. También estaba pensando en crear una tercera columna, HighorLow con una variable indicadora (1 ó 0) de si la temperatura es alta o baja. El I tendría:

fit = lm(Value~Temperature:HighorLow, data = df)

¿Alguien tiene alguna aportación?

1voto

user2735206 Puntos 51

Tu último método debería funcionar, pero puede ser un poco torpe de interpretar porque el coeficiente superior a 55 implicará sumar el coeficiente de interacción con el coeficiente de temperatura.

A regresión a trozos también puede funcionar. Puede encontrar algunos tutoriales aquí y aquí .

Dado que utilizas R, puede que también quieras echar un vistazo a su paquete segmentado .

1voto

Sean Hanley Puntos 2428

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 :

enter image description here

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:

enter image description here

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:

enter image description here

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

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X