Existem pacotes para fazer regressão linear por partes, que podem detectar os vários nós automaticamente? Obrigado. Quando eu uso o pacote strucchange. Não consegui detectar os pontos de mudança. Não faço ideia de como ele detecta os pontos de mudança. Pelas parcelas, pude ver que há vários pontos que quero que possam me ajudar a selecioná-los. Alguém poderia dar um exemplo aqui?
regression
change-point
Honglang Wang
fonte
fonte
segmented
pacote é o que você está procurando.segmented
pacote de R : stackoverflow.com/a/18715116/857416Respostas:
Será que MARS ser aplicável? R possui o pacote
earth
que o implementa.fonte
Em geral, é um pouco estranho querer ajustar algo como linear por partes. No entanto, se você realmente deseja fazer isso, o algoritmo MARS é o mais direto. Ele criará uma função, um nó de cada vez; e, em seguida, geralmente reduz o número de nós para combater árvores de decisão ala excessivas. Você pode acessar o algotitmo MARS em R via
earth
oumda
. Em geral, é adequado ao GCV, que não está tão distante do outro critério de informação (AIC, BIC etc.)O MARS não oferece realmente um ajuste "ideal", pois os nós crescem um de cada vez. Seria realmente difícil ajustar um número verdadeiramente "ideal" de nós, já que as possíveis permutações da colocação dos nós explodiriam rapidamente.
Geralmente, é por isso que as pessoas se voltam para suavizar splines. A maioria das splines de suavização é cúbica, para que você possa enganar um olho humano e perder as descontinuidades. No entanto, seria bem possível fazer uma spline de suavização linear. A grande vantagem de suavizar splines é seu único parâmetro para otimizar. Isso permite que você alcance rapidamente uma solução verdadeiramente "ideal" sem precisar pesquisar por várias permutações. No entanto, se você realmente deseja procurar pontos de inflexão e tem dados suficientes para fazê-lo, então algo como MARS provavelmente seria sua melhor aposta.
Aqui está um código de exemplo para splines de suavização linear penalizadas em R:
Os nós reais escolhidos não necessariamente se correlacionariam com quaisquer pontos de inflexão verdadeiros.
fonte
Programei isso do zero uma vez há alguns anos e tenho um arquivo Matlab para fazer regressão linear por partes no meu computador. Cerca de 1 a 4 pontos de interrupção são computacionalmente possíveis para cerca de 20 pontos de medição. 5 ou 7 pontos de interrupção começam a ser realmente demais.
A abordagem matemática pura, na minha opinião, é tentar todas as combinações possíveis, conforme sugerido pelo usuário mbq na pergunta vinculada ao comentário abaixo da sua pergunta.
Como as linhas ajustadas são todas consecutivas e adjacentes (sem sobreposições), a combinatória seguirá o triângulo Pascal. Se houvesse sobreposições entre os pontos de dados usados pelos segmentos de linha, acredito que a combinatória seguiria os números Stirling do segundo tipo.
A melhor solução em minha mente é escolher a combinação de linhas ajustadas que tem o menor desvio padrão dos valores de correlação R ^ 2 das linhas ajustadas. Vou tentar explicar com um exemplo. Lembre-se, porém, de que perguntar quantos pontos de interrupção devemos encontrar nos dados é semelhante a perguntar "Quanto tempo dura a costa da Grã-Bretanha?" como em um dos artigos de Benoit Mandelbrots (matemático) sobre fractais. E há uma troca entre o número de pontos de interrupção e a profundidade da regressão.
Agora para o exemplo.
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
fonte
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
fonte
... 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
fonte
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.
fonte
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.
fonte
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.
fonte