Tìm điểm thay đổi trong dữ liệu từ hàm tuyến tính từng phần


10

Lời chào hỏi,

Tôi đang thực hiện nghiên cứu sẽ giúp xác định kích thước của không gian quan sát và thời gian trôi qua kể từ vụ nổ lớn. Hy vọng bạn có thể giúp đỡ!

Tôi có dữ liệu phù hợp với hàm tuyến tính từng phần mà tôi muốn thực hiện hai hồi quy tuyến tính. Có một điểm mà độ dốc và đánh chặn thay đổi, và tôi cần (viết chương trình để) tìm điểm này.

Suy nghĩ?


3
Chính sách về đăng chéo là gì? Câu hỏi tương tự chính xác đã được hỏi trên math.stackexchange.com: math.stackexchange.com/questions/15214/ mẹo
mpiktas

Điều gì là sai khi làm bình phương tối thiểu phi tuyến tính đơn giản trong trường hợp này? Tôi có thiếu một cái gì đó rõ ràng?
grg s

Tôi muốn nói rằng đạo hàm của hàm mục tiêu liên quan đến tham số điểm thay đổi là không trơn tru
Andre Holzner

Độ dốc sẽ thay đổi nhiều đến mức một hình vuông nhỏ nhất phi tuyến tính sẽ không ngắn gọn và chính xác. Những gì chúng ta biết là chúng ta có hai hoặc nhiều mô hình tuyến tính, do đó chúng ta nên đình công để trích xuất hai mô hình đó.
HelloWorld

Câu trả lời:


1

Các mcpgói có thể làm điều này. Nói dữ liệu của bạn là

Đầu tiên, hãy mô phỏng một số dữ liệu:

df = data.frame(x = 1:100,
                y = c(rnorm(40, 10 + (1:40)*0.5),
                      rnorm(60, 10 + 40*0.5 -8 + (1:60)*0.2)))

Bây giờ hãy xem liệu chúng ta có thể khôi phục điểm thay đổi ở 40 (và các giá trị tham số) bằng cách sử dụng mcp:

model = list(
  y ~ 1 + x,  # linear segment
  ~ 1 + x  # another linear segment
)
library(mcp)
fit = mcp(model, df)

Cốt truyện đó. Các đường màu xám được rút ngẫu nhiên từ sự phù hợp, cho thấy rằng nó nắm bắt xu hướng. Đường cong màu xanh là vị trí điểm thay đổi ước tính:

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

Chúng ta hãy xem các ước tính tham số cá nhân. int_là chặn, x_là độ dốc trên x và cp_là điểm thay đổi:

summary(fit)

Population-level parameters:
    name  mean lower upper Rhat n.eff
    cp_1 40.48 40.02 41.00    1  2888
   int_1 11.12  9.11 13.17    1   778
   int_2 21.72 20.09 23.49    1   717
 sigma_1  3.23  2.76  3.69    1  5343
     x_1  0.46  0.36  0.54    1   724
     x_2  0.21  0.16  0.26    1   754

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


8

Cấu trúc gói R có thể giúp bạn. Nhìn vào họa tiết, nó có một cái nhìn tổng quan tốt đẹp để giải quyết các vấn đề tương tự.


6

XTôi= =(xTôi,yTôi)Tôi= =1,..,Nj2N-2{X1,...,Xj}{X(j+1),...,XN}j


Tôi đã đăng câu trả lời dựa trên đề xuất đơn giản nhưng hiệu quả của bạn.
HelloWorld

5

Đây là một vấn đề phát hiện thay đổi (ngoại tuyến). Thảo luận trước đây của chúng tôi cung cấp tài liệu tham khảo cho các bài báo và mã R. Trước tiên hãy xem "mô hình phân vùng sản phẩm" của Barry và Hartigan vì nó xử lý các thay đổi về độ dốc và có các triển khai hiệu quả.


3

Ngoài ra gói phân đoạn đã giúp tôi với các vấn đề tương tự trong quá khứ.


Thật không may, gói cần một giá trị bắt đầu cho điểm dừng.
HelloWorld

Ngoài ra, segmentedkhông thể mô hình hóa các thay đổi chặn giữa các phân đoạn - chỉ có thể chặn cho phân đoạn đầu tiên.
Jonas Lindeløv

2

Tôi xây dựng trên câu trả lời của mbq rằng tìm kiếm tất cả các khả năng. Hơn nữa, tôi làm điều này:

  • Kiểm tra tầm quan trọng của hai mô hình piecewise để đảm bảo các hệ số có ý nghĩa
  • Kiểm tra sự khác biệt với tổng số dư bình phương cho mô hình đầy đủ
  • Xác nhận mô hình của tôi một cách trực quan (đảm bảo nó không phải là thứ gì đó vô nghĩa)

Tại sao phải kiểm tra ý nghĩa? Đó là bởi vì điểm với SSE tối thiểu là vô nghĩa nếu một trong hai mô hình piecewise phù hợp với dữ liệu rất kém. Điều này có thể xảy ra đối với hai biến tương quan cao mà không có điểm dừng rõ ràng nơi độ dốc thay đổi.

Hãy kiểm tra phương pháp đơn giản này với một trường hợp thử nghiệm dễ dàng:

x <- c(-50:50)
y <- abs(x)
plot(x,y,pch=19)

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

Điểm dừng rõ ràng là bằng không. Sử dụng tập lệnh R sau:

f <- function(x, y)
{
    d <- data.frame(x=x, y=y)
    d <- d[order(x),]
    r <- data.frame(k=rep(0,length(x)-4), sums=rep(0,length(x)-4))

    plm <- function(i)
    {
        d1 <- head(d,i)
        d2 <- tail(d,-i)

        # Make sure we've divided the region perfectly        
        stopifnot(nrow(d1)+nrow(d2) == nrow(d))

        m1 <- lm(y~x, data=d1)
        m2 <- lm(y~x, data=d2)

        r <- list(m1, m2)
        r
    }

    lapply(2:(nrow(d)-3), function(i)
    {
        r$k[i-2] <<- d[i,]$x

        # Fit two piecewise linear models
        m <- plm(i)

        # Add up the sum of squares for residuals
        r$sums[i-2] <<- sum((m[[1]]$residuals)^2) + sum((m[[2]]$residuals)^2)
    })

    b <- r[which.min(r$sums),]    
    b
}

Phù hợp với mô hình tuyến tính piecewise cho tất cả các kết hợp có thể:

f(x,y)
   k sums
   0    0

Nếu chúng ta kiểm tra các hệ số cho hai mô hình tối ưu, chúng sẽ có ý nghĩa cao. R2 của họ cũng sẽ rất cao.

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.