การหาจุดเปลี่ยนแปลงในข้อมูลจากฟังก์ชันเชิงเส้นแบบต่อเนื่อง


10

ทักทาย,

ฉันกำลังทำการวิจัยที่จะช่วยกำหนดขนาดของพื้นที่ที่สังเกตและเวลาที่ผ่านไปนับตั้งแต่บิ๊กแบง หวังว่าคุณจะช่วยได้!

ฉันมีข้อมูลที่สอดคล้องกับฟังก์ชันเชิงเส้นเป็นเส้นตรงซึ่งฉันต้องการดำเนินการถดถอยเชิงเส้นสองแบบ มีประเด็นที่ความชันและการสกัดกั้นเปลี่ยนไปและฉันต้องการ (เขียนโปรแกรมเป็น) เพื่อหาจุดนี้

คิด?


3
นโยบายการข้ามโพสต์คืออะไร คำถามเดียวกันถูกถามใน math.stackexchange.com: math.stackexchange.com/questions/15214/ …
mpiktas

เกิดอะไรขึ้นกับการทำสแควร์สแควร์น้อยแบบไม่เชิงเส้นในกรณีนี้ ฉันขาดอะไรที่ชัดเจนหรือไม่
grg s

ฉันจะบอกว่าอนุพันธ์ของฟังก์ชั่นเป้าหมายที่เกี่ยวกับพารามิเตอร์จุดเปลี่ยนค่อนข้างไม่ราบรื่น
อังเดรโฮลเนอร์

ความชันจะเปลี่ยนไปมากจนจตุรัสน้อยที่ไม่เป็นเชิงเส้นจะไม่รัดกุมและแม่นยำ สิ่งที่เรารู้คือเรามีตัวแบบเชิงเส้นสองแบบขึ้นไปดังนั้นเราควรตีเพื่อแยกแบบจำลองทั้งสองนั้นออก
HelloWorld

คำตอบ:


1

mcpแพคเกจสามารถทำเช่นนี้ สมมติว่าข้อมูลของคุณคือ

อันดับแรกให้ลองจำลองข้อมูลบางส่วน:

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

ตอนนี้เรามาดูว่าเราสามารถกู้คืนจุดเปลี่ยนแปลงที่ 40 (และค่าพารามิเตอร์) โดยใช้mcp:

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

เขียนมัน เส้นสีเทาเป็นแบบสุ่มจากพอดีแสดงว่ามันจับแนวโน้ม เส้นโค้งสีน้ำเงินคือตำแหน่งจุดเปลี่ยนโดยประมาณ:

ป้อนคำอธิบายรูปภาพที่นี่

มาดูการประมาณพารามิเตอร์แต่ละรายการกัน int_เป็นจุดตัด, x_ลาดบน x, ​​และcp_เป็นจุดเปลี่ยน:

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

Disclaimer: mcpผมพัฒนาของ


8

แพคเกจ R strucchangeอาจช่วยให้คุณ ดูบทความสั้น ๆ มันมีภาพรวมที่ดีเกี่ยวกับวิธีการแก้ปัญหาที่คล้ายกัน


6

หากจำนวนคะแนนไม่ใหญ่เกินไปคุณอาจลองใช้ความเป็นไปได้ทั้งหมด สมมติว่ามีจุดต่าง ๆXผม=(xผม,Yผม) ที่ไหน ผม=1,..,ยังไม่มีข้อความ. กว่าคุณอาจวนซ้ำด้วยJ จาก 2 ถึง ยังไม่มีข้อความ-2 และใส่สองเส้นให้พอดีกับทั้งสอง {X1,...,XJ} และ {X(J+1),...,Xยังไม่มีข้อความ}. ในที่สุดคุณก็เลือกJ ซึ่งผลรวมของผลรวมของส่วนที่เหลือกำลังสองของทั้งสองเส้นมีค่าน้อยที่สุด


ฉันโพสต์คำตอบตามข้อเสนอแนะที่เรียบง่าย แต่มีประสิทธิภาพของคุณ
HelloWorld

5

นี่เป็นปัญหาการตรวจหาการเปลี่ยนแปลง (ออฟไลน์) การสนทนาก่อนหน้าของเราให้การอ้างอิงถึงบทความวารสารและรหัส R ดูที่รุ่น"พาร์ติชันผลิตภัณฑ์" ของBarry และ Hartiganก่อนเพราะมันรองรับการเปลี่ยนแปลงของความชันและมีการใช้งานที่มีประสิทธิภาพ


3

นอกจากนี้แพคเกจแบ่งยังช่วยฉันด้วยปัญหาที่คล้ายกันในอดีต


น่าเสียดายที่แพ็คเกจต้องการค่าเริ่มต้นสำหรับจุดพัก
HelloWorld

นอกจากนี้segmentedไม่สามารถสร้างโมเดลการดักจับการเปลี่ยนแปลงระหว่างเซ็กเมนต์ - เฉพาะการสกัดกั้นสำหรับเซ็กเมนต์แรก
Jonas Lindeløv

2

ฉันสร้างคำตอบของ mbq ​​เพื่อค้นหาความเป็นไปได้ทั้งหมด นอกจากนี้ฉันทำสิ่งนี้:

  • ตรวจสอบความสำคัญของทั้งสองรุ่นตามลำดับเพื่อให้แน่ใจว่าสัมประสิทธิ์มีความสำคัญ
  • ตรวจสอบความแตกต่างกับผลรวมของค่าคงที่กำลังสองสำหรับแบบเต็ม
  • ยืนยันโมเดลของฉันด้วยสายตา (ตรวจสอบให้แน่ใจว่าไม่ใช่เรื่องไร้สาระ)

ตรวจสอบความสำคัญทำไม นั่นเป็นเพราะจุดที่มี SSE ขั้นต่ำนั้นไม่มีความหมายหากแบบจำลองทั้งสองชิ้นนั้นเหมาะกับข้อมูลที่ไม่ดีมาก สิ่งนี้สามารถเกิดขึ้นได้สำหรับตัวแปรที่มีความสัมพันธ์สูงสองตัวแปรโดยไม่มีจุดพักที่ชัดเจนเมื่อมีการเปลี่ยนแปลงความลาดชัน

ลองตรวจสอบวิธีการง่ายๆนี้กับกรณีทดสอบง่ายๆ:

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

ป้อนคำอธิบายรูปภาพที่นี่

เห็นได้ชัดว่าเบรกพอยต์เป็นศูนย์ ใช้สคริปต์ R ต่อไปนี้:

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
}

ติดตั้งโมเดลเชิงเส้นตรงตามแนวแกนสำหรับการผสมที่เป็นไปได้ทั้งหมด:

f(x,y)
   k sums
   0    0

หากเราตรวจสอบค่าสัมประสิทธิ์สำหรับรุ่นที่ดีที่สุดสองแบบพวกเขาจะมีความสำคัญสูง R2 ของพวกเขาจะสูงมากเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.