Existe-t-il des packages pour effectuer une régression linéaire par morceaux, qui peut détecter automatiquement les nœuds multiples? Merci. Lorsque j'utilise le package strucchange. Je n'ai pas pu détecter les points de changement. Je ne sais pas comment il détecte les points de changement. À partir des parcelles, je pouvais voir qu'il y avait plusieurs points que je voulais, cela pourrait m'aider à les choisir. Quelqu'un pourrait-il donner un exemple ici?
regression
change-point
Honglang Wang
la source
la source
segmented
package est ce que vous recherchez.segmented
package de R : stackoverflow.com/a/18715116/857416Réponses:
Would MARS être applicable? R a le package
earth
qui l'implémente.la source
En général, il est un peu étrange de vouloir ajuster quelque chose comme linéaire par morceaux. Cependant, si vous le souhaitez vraiment, l'algorithme MARS est le plus direct. Il créera une fonction un nœud à la fois; puis taille généralement le nombre de nœuds pour lutter contre les arbres de décision ala sur-ajustés. Vous pouvez accéder à l'algorithme MARS dans R via
earth
oumda
. En général, il est compatible avec GCV qui n'est pas si éloigné des autres critères d'information (AIC, BIC etc.)MARS ne vous donnera pas vraiment un ajustement "optimal" car les nœuds sont développés un à la fois. Il serait vraiment assez difficile d'ajuster un nombre de nœuds vraiment «optimal», car les permutations possibles des emplacements de nœuds exploseraient rapidement.
Généralement, c'est pourquoi les gens se tournent vers les splines de lissage. La plupart des splines de lissage sont cubiques afin que vous puissiez tromper un œil humain en manquant les discontinuités. Il serait cependant tout à fait possible de faire une spline de lissage linéaire. Le gros avantage du lissage des splines est leur seul paramètre à optimiser. Cela vous permet d'atteindre rapidement une solution vraiment "optimale" sans avoir à chercher dans les bouffées de permutations. Cependant, si vous voulez vraiment rechercher des points d'inflexion et que vous avez suffisamment de données pour le faire, alors quelque chose comme MARS serait probablement votre meilleur pari.
Voici un exemple de code pour les splines de lissage linéaire pénalisées dans R:
Cependant, les nœuds réels choisis ne seraient pas nécessairement en corrélation avec de véritables points d'inflexion.
la source
J'ai programmé cela à partir de zéro une fois il y a quelques années, et j'ai un fichier Matlab pour faire une régression linéaire par morceaux sur mon ordinateur. Environ 1 à 4 points d'arrêt sont calculables pour environ 20 points de mesure. 5 ou 7 points de rupture commencent à être vraiment trop.
L'approche mathématique pure telle que je la vois est d'essayer toutes les combinaisons possibles comme suggéré par l'utilisateur mbq dans la question liée au commentaire ci-dessous votre question.
Puisque les lignes ajustées sont toutes consécutives et adjacentes (pas de chevauchements), la combinatoire suivra le triangle de Pascals. S'il y avait des chevauchements entre les points de données utilisés par les segments de ligne, je crois que la combinatoire suivrait plutôt les nombres de Stirling du deuxième type.
La meilleure solution dans mon esprit est de choisir la combinaison de lignes ajustées qui présente l'écart type le plus faible des valeurs de corrélation R ^ 2 des lignes ajustées. Je vais essayer d'expliquer avec un exemple. Gardez à l'esprit que demander combien de points de rupture on devrait trouver dans les données revient à poser la question "Quelle est la longueur de la côte de la Grande-Bretagne?" comme dans l'un des articles de Benoit Mandelbrots (un mathématicien) sur les fractales. Et il y a un compromis entre le nombre de points de rupture et la profondeur de régression.
Passons maintenant à l'exemple.
These y values have the graph:
Which clearly has two break points. For the sake of argument we will calculate the R^2 correlation values (with the Excel cell formulas (European dot-comma style)):
for all possible non-overlapping combinations of two fitted lines. All the possible pairs of R^2 values have the graph:
The question is which pair of R^2 values should we choose, and how do we generalize to multiple break points as asked in the title? One choice is to pick the combination for which the sum of the R-square correlation is the highest. Plotting this we get the upper blue curve below:
The blue curve, the sum of the R-squared values, is the highest in the middle. This is more clearly visible from the table with the value1,0455 as the highest value.
However it is my opinion that the minimum of the red curve is more accurate. That is, the minimum of the standard deviation of the R^2 values of the fitted regression lines should be the best choice.
Piece wise linear regression - Matlab - multiple break points
la source
There is a pretty nice algorithm described in Tomé and Miranda (1984).
The code and a GUI are available in both Fortran and IDL from their website: http://www.dfisica.ubi.pt/~artome/linearstep.html
la source
... first of all you must to do it by iterations, and under some informative criterion, like AIC AICc BIC Cp; because you can get an "ideal" fit, if number of knots K = number od data points N, ok. ... first put K = 0; estimate L = K + 1 regressions, calculate AICc, for instance; then assume minimal number of data points at a separate segment, say L = 3 or L = 4, ok ... put K = 1; start from L-th data as the first knot, calculate SS or MLE, ... and step by step the next data point as a knot, SS or MLE, up to the last knot at the N - L data; choose the arrangement with the best fit (SS or MLE) calculate AICc ... ... put K = 2; ... use all previous regressions (that is their SS or MLE), but step by step divide a single segment into all possible parts ... choose the arrangement with the best fit (SS or MLE) calculate AICc ... if the last AICc occurs greater then the previous one: stop the iterations ! This is an optimal solution under AICc criterion, ok
la source
I once came across a program called Joinpoint. On their website they say it fits a joinpoint model where "several different lines are connected together at the 'joinpoints'". And further: "The user supplies the minimum and maximum number of joinpoints. The program starts with the minimum number of joinpoint (e.g. 0 joinpoints, which is a straight line) and tests whether more joinpoints are statistically significant and must be added to the model (up to that maximum number)."
The NCI uses it for trend modelling of cancer rates, maybe it fits your needs as well.
la source
In order to fit to data a piecewise function :
wherea1,a2,p1,q1,p2,q2,p3,q3 are unknown parameters to be approximately computed, there is a very simple method (not iterative, no initial guess, easy to code in any math computer language). The theory given page 29 in paper : https://fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf and from page 30 :
For example, with the exact data provided by Mats Granvik the result is :
Without scattered data, this example is not very signifiant. Other examples with scattered data are shown in the referenced paper.
la source
You can use the
mcp
package if you know the number of change points to infer. It gives you great modeling flexibility and a lot of information about the change points and regression parameters, but at the cost of speed.The mcp website contains many applied examples, e.g.,
Then you can visualize:
Or summarise:
Disclaimer: I am the developer of mcp.
la source