Làm thế nào để thực hiện hồi quy tuyến tính piecewise với nhiều nút thắt chưa biết?


14

Có gói nào để thực hiện hồi quy tuyến tính piecewise, có thể tự động phát hiện nhiều nút thắt không? Cảm ơn. Khi tôi sử dụng gói strucchange. Tôi không thể phát hiện các điểm thay đổi. Tôi không biết làm thế nào nó phát hiện các điểm thay đổi. Từ các lô, tôi có thể thấy có một số điểm tôi muốn nó có thể giúp tôi chọn ra. Bất cứ ai có thể đưa ra một ví dụ ở đây?


1
Đây có vẻ là câu hỏi tương tự như stats.stackexchange.com/questions/5700/ . Nếu nó khác nhau theo bất kỳ cách đáng kể nào, vui lòng cho chúng tôi biết bằng cách chỉnh sửa câu hỏi của bạn để phản ánh sự khác biệt; nếu không, chúng tôi sẽ đóng nó như một bản sao.
whuber

1
Tôi đã chỉnh sửa câu hỏi.
Honglang Wang

1
Tôi nghĩ bạn có thể làm điều này như một vấn đề tối ưu phi tuyến tính. Chỉ cần viết phương trình của hàm sẽ được trang bị, với các hệ số và vị trí nút làm tham số.
đánh dấu999

1
Tôi nghĩ rằng segmentedgói là những gì bạn đang tìm kiếm.
AlefSin

1
Tôi đã gặp một vấn đề giống hệt nhau, đã giải quyết nó với segmentedgói của R : stackoverflow.com/a/18715116/857416
một ben khác

Câu trả lời:



8

Nói chung, hơi kỳ quặc khi muốn phù hợp với một cái gì đó như tuyến tính mảnh. Tuy nhiên, nếu bạn thực sự muốn làm như vậy, thì thuật toán MARS là trực tiếp nhất. Nó sẽ xây dựng một chức năng một nút thắt tại một thời điểm; và sau đó thường cắt tỉa lại số nút thắt để chống lại các cây quyết định ala quá phù hợp. Bạn có thể truy cập đại số MARS trong R thông qua earthhoặc mda. Nói chung, nó phù hợp với GCV không bị loại bỏ khỏi tiêu chí thông tin khác (AIC, BIC, v.v.)

MARS sẽ không thực sự mang đến cho bạn sự phù hợp "tối ưu" vì các nút thắt được phát triển cùng một lúc. Thực sự sẽ rất khó để phù hợp với số lượng nút thắt "tối ưu" thực sự vì các hoán vị có thể có của các vị trí nút sẽ nhanh chóng phát nổ.

Nói chung, đây là lý do tại sao mọi người chuyển sang làm mịn splines. Hầu hết các spline làm mịn là hình khối chỉ để bạn có thể đánh lừa mắt người để bỏ lỡ những điểm không liên tục. Tuy nhiên, hoàn toàn có thể thực hiện một spline làm mịn tuyến tính. Ưu điểm lớn của làm mịn splines là tham số duy nhất của chúng để tối ưu hóa. Điều đó cho phép bạn nhanh chóng đạt được một giải pháp thực sự "tối ưu" mà không cần phải tìm kiếm thông qua các hoán vị. Tuy nhiên, nếu bạn thực sự muốn tìm kiếm các điểm uốn và bạn có đủ dữ liệu để làm như vậy, thì một cái gì đó như MARS có thể là lựa chọn tốt nhất của bạn.

Dưới đây là một số mã ví dụ cho các spline làm mịn tuyến tính bị phạt trong R:

require(mgcv);data(iris);
gam.test <- gam(Sepal.Length ~ s(Petal.Width,k=6,bs='ps',m=0),data=iris)
summary(gam.test);plot(gam.test);

Các nút thắt thực tế được chọn sẽ không nhất thiết tương quan với bất kỳ điểm uốn thực sự nào.


3

Tôi đã lập trình điều này từ đầu một vài năm trước đây và tôi có một tệp Matlab để thực hiện hồi quy tuyến tính mảnh khôn ngoan trên máy tính của mình. Khoảng 1 đến 4 điểm dừng là có thể tính toán cho khoảng 20 điểm đo hoặc hơn. 5 hoặc 7 điểm phá vỡ bắt đầu thực sự quá nhiều.

Cách tiếp cận toán học thuần túy như tôi thấy là thử tất cả các kết hợp có thể theo đề xuất của người dùng mbq trong câu hỏi được liên kết trong nhận xét bên dưới câu hỏi của bạn.

Vì các đường được trang bị đều liên tiếp và liền kề (không trùng lặp), tổ hợp sẽ theo tam giác Pascals. Nếu có sự chồng chéo giữa các điểm dữ liệu được sử dụng bởi các phân đoạn dòng, tôi tin rằng tổ hợp sẽ theo số Stirling của loại thứ hai thay thế.

Giải pháp tốt nhất trong tâm trí của tôi là chọn kết hợp các đường được trang bị có độ lệch chuẩn thấp nhất trong các giá trị tương quan R ^ 2 của các đường được trang bị. Tôi sẽ cố gắng giải thích với một ví dụ. Hãy ghi nhớ rằng việc hỏi có bao nhiêu điểm dừng trong dữ liệu, tương tự như đặt câu hỏi "Bờ biển nước Anh dài bao nhiêu?" như trong một trong những bài viết của Benoit Mandelbrots (một nhà toán học) về fractals. Và có một sự đánh đổi giữa số điểm phá vỡ và độ sâu hồi quy.

Bây giờ đến ví dụ.

yxxy

xyR2line1R2line2sumofR2valuesstandarddeviationofR2111,0000,04001,04000,6788221,0000,01181,01180,6987331,0000,00041,00040,7067441,0000,00311,00310,7048551,0000,01351,01350,6974661,0000,02381,02380,6902771,0000,02771,02770,6874881,0000,02221,02220,6913991,0000,00931,00930,700410101,0001,9781,0000,70711190,97090,02710,99800,66731280,89510,11391,00900,55231370,77340,25581,02920,36591460,61340,43211,04550,12811550,43210,61341,04550,12821640,25580,77331,02910,36591730,11390,89511,00900,55231820,02720,97080,99800,667219101,0001,0000,70712020,00941,0001,00940,70042130,02221,0001,02220,69142240,02781,0001,02780,68742350,02391,0001,02390,69022460,01361,0001,01360,69742570,00321,0001,00320,70482680,00041,0001,00040,70682790,01181,0001,01180,698728100,041,0001,040,6788

These y values have the graph:

dữ liệu lý tưởng hóa

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)):

=INDEX(LINEST(B1:$B$1;A1:$A$1;TRUE;TRUE);3;1)
=INDEX(LINEST(B1:$B$28;A1:$A$28;TRUE;TRUE);3;1)

for all possible non-overlapping combinations of two fitted lines. All the possible pairs of R^2 values have the graph:

R ^ 2 giá trị

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:

tổng bình phương R và độ lệch chuẩn của bình phương R

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 value 1,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


1

There is a pretty nice algorithm described in Tomé and Miranda (1984).

The proposed methodology uses a least-squares approach to compute the best continuous set of straight lines that fit a given time series, subject to a number of constraints on the minimum distance between breakpoints and on the minimum trend change at each breakpoint.

The code and a GUI are available in both Fortran and IDL from their website: http://www.dfisica.ubi.pt/~artome/linearstep.html


0

... 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


AIC, BIC can't be used because they penalised for extra parameters, which is clearly not the case here.
HelloWorld

0

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)."

NCI sử dụng nó để mô hình hóa xu hướng tỷ lệ ung thư, có thể nó cũng phù hợp với nhu cầu của bạn.


0

Để phù hợp với dữ liệu một chức năng từng phần:

nhập mô tả hình ảnh ở đây

Ở đâu một1,một2,p1,q1,p2,q2,p3,q3là các tham số chưa biết được tính toán xấp xỉ, có một phương pháp rất đơn giản (không lặp, không đoán ban đầu, dễ viết mã trong bất kỳ ngôn ngữ máy tính toán học nào). Lý thuyết được đưa ra ở trang 29 trên giấy: https://fr.scribed.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf và từ trang 30:

nhập mô tả hình ảnh ở đây

Ví dụ: với dữ liệu chính xác được cung cấp bởi Mats Granvik, kết quả là:

nhập mô tả hình ảnh ở đây

Không có dữ liệu phân tán, ví dụ này không có ý nghĩa lắm. Các ví dụ khác với dữ liệu phân tán được hiển thị trong bài viết được tham chiếu.


0

Bạn có thể dùng mcp gói nếu bạn biết số lượng điểm thay đổi để suy ra. Nó cung cấp cho bạn tính linh hoạt mô hình tuyệt vời và nhiều thông tin về các điểm thay đổi và tham số hồi quy, nhưng với chi phí tốc độ.

Trang web mcp chứa nhiều ví dụ được áp dụng, ví dụ:

library(mcp)

# Define the model
model = list(
  response ~ 1,  # plateau (int_1)
  ~ 0 + time,    # joined slope (time_2) at cp_1
  ~ 1 + time     # disjoined slope (int_3, time_3) at cp_2
)

# Fit it. The `ex_demo` dataset is included in mcp
fit = mcp(model, data = ex_demo)

Sau đó, bạn có thể hình dung:

plot(fit)

nhập mô tả hình ảnh ở đây

Hoặc tóm tắt:

summary(fit)

Family: gaussian(link = 'identity')
Iterations: 9000 from 3 chains.
Segments:
  1: response ~ 1
  2: response ~ 1 ~ 0 + time
  3: response ~ 1 ~ 1 + time

Population-level parameters:
    name match  sim  mean lower  upper Rhat n.eff
    cp_1    OK 30.0 30.27 23.19 38.760    1   384
    cp_2    OK 70.0 69.78 69.27 70.238    1  5792
   int_1    OK 10.0 10.26  8.82 11.768    1  1480
   int_3    OK  0.0  0.44 -2.49  3.428    1   810
 sigma_1    OK  4.0  4.01  3.43  4.591    1  3852
  time_2    OK  0.5  0.53  0.40  0.662    1   437
  time_3    OK -0.2 -0.22 -0.38 -0.035    1   834

Tuyên bố miễn trừ trách nhiệm: Tôi là nhà phát triển của mcp.


Việc sử dụng "phát hiện" trong câu hỏi cho biết số lượng - và thậm chí sự tồn tại - của các điểm thay đổi không được biết trước.
whuber
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.