Régression monotone robuste dans R

8

J'ai le tableau suivant dans 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

Je peux tracer les points et l'ajustement linéaire d'un Tukey ( linefonction dans R) via

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

qui produit:

entrez la description de l'image ici

Tout va bien. Le graphique ci-dessus montre les valeurs de consommation d'énergie, qui ne devraient qu'augmenter, donc je suis satisfait de l'ajustement ne passant pas par ces deux points (qui seront ensuite signalés comme des valeurs aberrantes).

Cependant, "juste" supprimer le dernier point et replacer à nouveau

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

Le résultat est complètement différent.

entrez la description de l'image ici

Mon besoin est d'avoir idéalement le même résultat dans les deux scénarios ci-dessus. R ne semble pas avoir de fonction prête à l'emploi pour la régression monotone, isoregqui est d'ailleurs constante par morceaux.

ÉDITER:

Comme l'a souligné @Glen_b, le rapport de taille des valeurs aberrantes sur échantillon est trop élevé (~ 28%) pour la technique de régression utilisée ci-dessus. Cependant, je pense qu'il pourrait y avoir autre chose à considérer. Si j'ajoute les points au début du tableau:

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

et recalculer à nouveau comme ci-dessus plot(data=df, y ~ x); lines(df$x, line(df$x,df$y)$fitted.values)j'obtiens le même résultat, avec une ration de ~ 22%

entrez la description de l'image ici

Michele
la source
Pourriez-vous nous expliquer ce que vous entendez par "la ligne de Tukey"? (Il a utilisé diverses méthodes d'ajustement de ligne résistantes.)
whuber
@whuber oh je vois, désolé. La méthode mise en œuvre dans la fonction R line. Vous pouvez avoir plus de détails en tapant ?linedans la console r
Michele
Merci, mais je crains que ce ne soit pas bon du tout: l'aide se réfère simplement au livre EDA de Tukey de 1977 - avec lequel je suis assez familier et dans lequel je peux identifier de nombreuses méthodes d'ajustement de ligne - et le code appelle simplement un C programme. Peut-être pourrions-nous progresser si vous pouviez expliquer plus clairement ce que vous essayez de réaliser. Comment caractériseriez-vous (en général) la différence entre vos deux "scénarios"? Pourquoi préférez-vous la première solution?
whuber
1
(+1) "Ne devrait qu'augmenter" est la clé: vous demandez comment effectuer une régression monotone (robuste) . Il serait utile de souligner davantage ce point dans votre question: vous obtiendrez de meilleures réponses.
whuber
1
@Michele Peut-être pourriez-vous jeter un œil au nnlspaquet (moindres carrés non négatifs). Cela devrait vous aider avec les contraintes de positivité, mais pas avec les valeurs aberrantes.
Matteo Fasiolo

Réponses:

10

Je note qu'après avoir supprimé le dernier point, vous n'avez que sept valeurs dont deux (28,6%!) Sont aberrantes. De nombreuses méthodes robustes n'ont pas un point de ventilation aussi élevé (par exemple, la régression de Theil se décompose juste à ce point pour n = 7, bien qu'en généraln il passe à 29,3%), mais si vous devez avoir une ventilation si élevée qu'elle peut gérer autant de valeurs aberrantes, vous devez choisir une approche qui a réellement ce point de panne plus élevé.

Il y en a dans R; la rlmfonction dans MASS(M-estimation) devrait traiter ce cas particulier (elle présente une ventilation élevée par rapport aux valeurs aberrantes), mais elle n'aura pas la robustesse aux valeurs aberrantes influentes .

La fonction lqsdans le même paquet devrait traiter les valeurs aberrantes influentes, ou il existe un certain nombre de bons paquets pour une régression robuste sur CRAN.

Vous pouvez trouver Fox and Weisberg's Robust Regression in R ( pdf ) une ressource utile sur plusieurs concepts de régression robustes.

Tout cela ne concerne que la régression linéaire robuste et ignore la contrainte de monotonie, mais j'imagine que ce sera moins problématique si vous obtenez le problème de panne trié. Si vous obtenez toujours une pente négative après avoir effectué une régression robuste à fort claquage, mais que vous souhaitez une ligne non décroissante, vous devez définir la ligne sur une pente nulle, c'est-à-dire choisir une estimation d'emplacement robuste et définir la ligne pour qu'elle y soit constante. (Si vous voulez une régression robuste non linéaire mais monotone, vous devez le mentionner spécifiquement.)


En réponse à l'édition:

Vous semblez avoir interprété mon exemple de la régression de Theil comme un commentaire sur le point de rupture de line. Ce n'était pas; ce fut simplement le premier exemple d'une ligne robuste qui m'est venue qui est tombée en panne avec une moindre proportion de contamination.

Comme nous l'avons déjà expliqué, nous ne pouvons pas facilement dire laquelle de plusieurs lignes est utilisée line. La raison pour laquelle il linese décompose comme il dépend de celui de plusieurs estimateurs robustes possibles que Tukey mentionne et linepourrait utiliser.

Par exemple, si c'est la ligne qui va `` diviser les données en trois groupes et pour la pente, utiliser la pente de la ligne joignant les médianes des deux tiers extérieurs '' (parfois appelée ligne résistante à trois groupes ou ligne médiane-médiane ), alors son point de rupture est asymptotiquement 1/6, et son comportement dans de petits échantillons dépend exactement de la façon dont les points sont attribués aux groupes lorsquen n'est pas un multiple de 3.

S'il vous plaît noter que je ne dis pas qu'il est la ligne résistant à trois groupes qui est mis en œuvre line- en fait , je pense que ce n'est pas - mais simplement que tout ce qu'ils ont mis en œuvre linepourrait bien avoir un point de rupture telle que la ligne qui en résulte ne peut pas traiter 2 points impairs sur 8, s'ils sont dans la «bonne» position.

En fait, la ligne implémentée dans linea un comportement bizarre - si étrange que je me demande si elle pourrait avoir un bug - si vous faites cela:

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

Ensuite, la lineligne a une pente de 1,2:

entrez la description de l'image ici

Du haut de ma tête, je ne me souviens d'aucune des répliques de Tukey ayant ce comportement.


Ajouté beaucoup plus tard: j'ai signalé ce problème aux développeurs il y a quelque temps; il a fallu quelques versions avant qu'il ne soit corrigé mais maintenant line(qui s'est avéré être une forme de la ligne à trois groupes de Tukey) n'a plus ce bogue; il semble maintenant se comporter comme je m'y attendais dans tous les cas que j'ai essayés.

Glen_b -Reinstate Monica
la source
Salut merci pour tout ça. Pour le moment, mon besoin est une régression linéaire monotone. Le point de panne est très intéressant et j'aurais certainement dû y réfléchir. Cependant, pouvez-vous commenter le troisième graphique que je viens d'ajouter? J'ajoute deux points au début qui devraient ramener le ratio à 22%
Michele
au fait lqsfait le boulot! J'accepte donc votre réponse :-) merci beaucoup. Si vous pouviez encore m'aider à comprendre le troisième graphique, ce serait génial! Acclamations
Michele
1
J'ai fait un montage qui, je l'espère, clarifie quelque peu les choses. Si j'ai raté quelque chose, faites-le moi savoir.
Glen_b -Reinstate Monica
Merci beaucoup. Je ne suis pas statisticien (facile à dire) et vous avez été très utile! Je pense que je vais rester avec lqspour l'instant. Merci encore
Michele