Robusta regresión monotónica en R

8

Tengo la siguiente tabla en R

df <- structure(list(x = structure(c(12458, 12633, 12692, 12830, 13369, 
13455, 13458, 13515), class = "Date"), y = c(6080, 6949, 7076, 
7818, 0, 0, 10765, 11153)), .Names = c("x", "y"), row.names = c("1", 
"2", "3", "4", "5", "6", "8", "9"), class = "data.frame")

> df
           x     y
1 2004-02-10  6080
2 2004-08-03  6949
3 2004-10-01  7076
4 2005-02-16  7818
5 2006-08-09     0
6 2006-11-03     0
8 2006-11-06 10765
9 2007-01-02 11153

Puedo trazar los puntos y el ajuste lineal de Tukey ( linefunción en R) a través de

plot(data=df,  y ~ x)
lines(df$x, line(df$x, df$y)$fitted.values)

que produce:

ingrese la descripción de la imagen aquí

Todo muy bien. El gráfico anterior muestra los valores de consumo de energía, que se espera que solo aumenten, por lo que estoy contento con el ajuste que no pasa por esos dos puntos (que posteriormente se marcarán como valores atípicos).

Sin embargo, "simplemente" elimina el último punto y vuelve a responder

df <- df[-nrow(df),]
plot(data=df,  y ~ x)
lines(df$x, line(df$x, df$
)$fitted.values)

El resultado es completamente diferente.

ingrese la descripción de la imagen aquí

Mi necesidad es tener idealmente el mismo resultado en los dos escenarios anteriores. R no parece tener una función lista para usar para la regresión monotónica, además de lo isoregcual, sin embargo, es constante por partes.

EDITAR:

Como señaló @Glen_b, la relación de tamaño atípico a muestra es demasiado grande (~ 28%) para la técnica de regresión utilizada anteriormente. Sin embargo, creo que podría haber algo más a considerar. Si agrego los puntos al comienzo de la tabla:

df <- rbind(data.frame(x=c(as.Date("2003-10-01"), as.Date("2003-12-01")), y=c(5253,5853)), df)

y recalculo nuevamente como arriba plot(data=df, y ~ x); lines(df$x, line(df$x,df$y)$fitted.values)obtengo el mismo resultado, con una ración de ~ 22%

ingrese la descripción de la imagen aquí

Michele
fuente
¿Podría explicarnos qué quiere decir con "línea de Tukey"? (Utilizó varios métodos de ajuste de línea resistente.)
whuber
@whuber oh ya veo, lo siento. Es el método implementado en la función R line. Puede obtener más detalles escribiendo ?lineen la consola r
Michele
Gracias, pero me temo que no sirve para nada: la ayuda simplemente se refiere al libro EDA de Tukey de 1977, con el que estoy bastante familiarizado y en el que puedo identificar muchos métodos de ajuste de línea, y el código simplemente invoca una C programa. Tal vez podríamos avanzar si pudiera explicar más claramente lo que está tratando de lograr. ¿Cómo caracterizaría (en general) la diferencia entre sus dos "escenarios"? ¿Por qué prefieres la primera solución?
whuber
1
(+1) "Solo debería aumentar" es clave: está preguntando cómo realizar una regresión monotónica (robusta) . Sería útil enfatizar más ese punto en su pregunta: obtendrá mejores respuestas.
whuber
1
@Michele Quizás puedas echar un vistazo al nnlspaquete (mínimos cuadrados no negativos). Eso debería ayudarlo con las restricciones de positividad, pero no con los valores atípicos.
Matteo Fasiolo

Respuestas:

10

Observo que después de eliminar el último punto, solo tiene siete valores, de los cuales dos (¡28.6%!) Son valores atípicos. Muchos métodos robustos no tienen un punto de descomposición tan alto (p. Ej., La regresión de Theil se descompone justo en ese punto para n = 7, aunque en general va al 29.3%), pero si debe tener un desglose tan alto que puede gestionar tantos valores atípicos, debe elegir un enfoque que realmente tenga ese punto de ruptura más alto.n

Hay algunos disponibles en R; la rlmfunción en MASS(estimación M) debería tratar este caso particular (tiene un alto desglose contra los valores atípicos), pero no tendrá solidez frente a los valores atípicos influyentes .

La función lqsen el mismo paquete debe tratar con valores atípicos influyentes, o hay varios paquetes buenos para una regresión robusta en CRAN.

Puede encontrar la regresión robusta de Fox y Weisberg en R ( pdf ) un recurso útil sobre varios conceptos de regresión robustos.

Todo esto solo se trata de una regresión lineal robusta e ignora la restricción de monotonicidad, pero me imagino que será un problema menor si soluciona el problema de descomposición. Si todavía obtiene una pendiente negativa después de realizar una regresión robusta de alto desglose, pero desea una línea que no disminuya, configuraría la línea para que tenga una pendiente cero, es decir, elija una estimación de ubicación robusta y establezca la línea como constante allí. (Si desea una regresión robusta no lineal pero monotónica, debe mencionarla específicamente).


En respuesta a la edición:

Parece haber interpretado mi ejemplo de la regresión de Theil como un comentario sobre el punto de ruptura de line. No era; fue simplemente el primer ejemplo de una línea robusta que se me ocurrió que se descompuso en una proporción menor de contaminación.

Como Whuber ya explicó, no podemos decir fácilmente cuál de varias líneas está utilizando line. La razón por la que linese descompone depende de cuál de los varios estimadores robustos posibles que Tukey menciona y linepodría usar.

Por ejemplo, si es la línea que va 'divide los datos en tres grupos y para la pendiente use la pendiente de la línea que une las medianas de los dos tercios exteriores' (a veces llamada la línea resistente de tres grupos , o la línea mediana-mediana) ), entonces su punto de ruptura es asintóticamente 1/6, y su comportamiento en muestras pequeñas depende exactamente de cómo se asignan los puntos a los grupos cuando no es múltiplo de 3.n

Tenga en cuenta que no estoy diciendo que es la línea resistente tres grupos que se implementa en line- de hecho creo que es no - sino simplemente que lo que han puesto en práctica en linebien puede tener un punto de ruptura de tal manera que la línea resultante no puede tratar con 2 puntos impares de 8, si están en las posiciones 'correctas'.

De hecho, la línea implementada linetiene un comportamiento extraño, tan extraño que me pregunto si podría tener un error, si haces esto:

 x = y = 1:9 #all points lie on a line with slope 1
 plot(x,y)
 abline(line(x,y),col=2)

Entonces la linelínea tiene pendiente 1.2:

ingrese la descripción de la imagen aquí

Fuera de mi cabeza, no recuerdo ninguna de las líneas de Tukey que tengan ese comportamiento.


Agregado mucho más tarde: informé este problema a los desarrolladores hace algún tiempo; tomó un par de lanzamientos antes de que se solucione, pero ahora line(que resultó ser una forma de la línea de tres grupos de Tukey) ya no tiene este error; ahora parece comportarse como lo esperaba en todos los casos que he intentado.

Glen_b -Reinstate a Monica
fuente
Hola, gracias por todo eso. Por el momento, mi necesidad es una regresión monotónica lineal . El punto de ruptura es muy interesante y definitivamente debería haberlo considerado. Sin embargo, ¿puede comentar el tercer gráfico que acabo de agregar? Agrego dos puntos al principio que deberían llevar la proporción al 22%
Michele
por cierto lqshace el trabajo! Así que acepto tu respuesta :-) muchas gracias. ¡Si todavía pudieras ayudarme a entender el tercer gráfico, sería genial! Saludos
Michele
1
He hecho una edición que espero aclare un poco las cosas. Si me he perdido algo, avísame.
Glen_b -Reinstate Monica
Muchas gracias. No soy un estadístico (fácil de decir), ¡y me han sido de gran ayuda! Creo que me quedaré lqspor ahora. Gracias de nuevo
Michele