วิธีการถดถอยเชิงเส้นทีละน้อยพร้อมปมที่ไม่รู้จักหลายวิธี


14

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


1
นี้ดูเหมือนจะเป็นคำถามเดียวกับstats.stackexchange.com/questions/5700/... หากมีความแตกต่างอย่างมีนัยสำคัญโปรดแจ้งให้เราทราบโดยแก้ไขคำถามของคุณเพื่อสะท้อนความแตกต่าง มิฉะนั้นเราจะปิดเป็นซ้ำ
whuber

1
ฉันแก้ไขคำถามแล้ว
Honglang Wang

1
ฉันคิดว่าคุณสามารถทำสิ่งนี้เป็นปัญหาการเพิ่มประสิทธิภาพที่ไม่ใช่เชิงเส้น เพียงเขียนสมการของฟังก์ชั่นที่จะติดตั้งโดยมีค่าสัมประสิทธิ์และตำแหน่งปมเป็นพารามิเตอร์
mark999

1
ฉันคิดว่าsegmentedแพ็คเกจเป็นสิ่งที่คุณกำลังมองหา
AlefSin

1
ฉันมีปัญหาเหมือนกันแก้ไขด้วยsegmentedแพ็คเกจของ R : stackoverflow.com/a/18715116/857416
ที่แตกต่าง

คำตอบ:



8

โดยทั่วไปแล้วมันค่อนข้างแปลกที่ต้องการให้พอดีกับบางสิ่งบางอย่างเป็นเส้นตรงที่ชาญฉลาด อย่างไรก็ตามหากคุณต้องการทำเช่นนั้นจริงๆแล้วอัลกอริทึม MARS จะตรงที่สุด มันจะสร้างฟังก์ชั่นหนึ่งปมในเวลา; และโดยปกติแล้วจะตัดกลับจำนวนนอตเพื่อต่อสู้กับต้นไม้ตัดสินใจ Ala ที่เหมาะสม คุณสามารถเข้าถึง algotithm MARS ใน R ผ่านหรือearth mdaโดยทั่วไปจะเหมาะกับ GCV ซึ่งอยู่ไม่ไกลจากเกณฑ์ข้อมูลอื่น ๆ (AIC, BIC ฯลฯ )

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

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

ต่อไปนี้เป็นตัวอย่างโค้ดสำหรับการปรับสมูทเชิงเส้นเชิงราบใน 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);

ปมที่แท้จริงที่ได้รับการแต่งตั้งนั้นไม่จำเป็นต้องมีความสัมพันธ์กับคะแนนการเบี่ยงเบนใด ๆ


3

ฉันได้ตั้งโปรแกรมนี้ตั้งแต่เริ่มต้นเมื่อไม่กี่ปีที่ผ่านมาและฉันมีไฟล์ Matlab สำหรับทำการถดถอยเชิงเส้นอย่างชาญฉลาดบนคอมพิวเตอร์ของฉัน จุดหยุดประมาณ 1 ถึง 4 สามารถคำนวณได้ประมาณ 20 จุดในการวัด จุดพัก 5 หรือ 7 จุดเริ่มมากเกินไป

วิธีการทางคณิตศาสตร์ที่บริสุทธิ์อย่างที่ฉันเห็นคือลองชุดค่าผสมที่เป็นไปได้ทั้งหมดตามที่ผู้ใช้ mbq แนะนำในคำถามที่เชื่อมโยงกับในความคิดเห็นด้านล่างคำถามของคุณ

เนื่องจากเส้นที่ติดตั้งนั้นต่อเนื่องกันและอยู่ติดกัน (ไม่มีการเหลื่อมกัน) คอมบิเนเตอร์จะตามสามเหลี่ยม Pascals หากมีการซ้อนทับกันระหว่างจุดข้อมูลที่ใช้โดยส่วนของเส้นผมเชื่อว่า combinatorics จะตามตัวเลขสเตอร์ลิงของชนิดที่สองแทน

ทางออกที่ดีที่สุดในใจของฉันคือการเลือกการรวมกันของสายการประกอบที่มีค่าเบี่ยงเบนมาตรฐานต่ำสุดของค่าความสัมพันธ์ R ^ 2 ของสายการประกอบ ฉันจะพยายามอธิบายด้วยตัวอย่าง โปรดทราบว่าการสอบถามว่ามีจุดพักจำนวนเท่าใดที่ควรพบในข้อมูลคล้ายกับการถามคำถาม "ชายฝั่งอังกฤษยาวเท่าไหร่" ในฐานะหนึ่งในเบอนัวต์แมนเดลบอต (นักคณิตศาสตร์) มีเอกสารเกี่ยวกับเศษส่วน และมีการแลกเปลี่ยนระหว่างจำนวนจุดพักและความลึกการถดถอย

ตอนนี้เป็นตัวอย่าง

YxxY

xYR2ล.ผมnอี1R2ล.ผมnอี2sยูม.โอR2โวลต์aล.ยูอีssเสื้อandaRddอีโวลต์ผมaเสื้อผมโอnโอR2111,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,000-1,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

ค่า y เหล่านี้มีกราฟ:

ข้อมูลในอุดมคติ

ซึ่งมีจุดแตกหักสองจุดอย่างชัดเจน เพื่อประโยชน์ในการโต้แย้งเราจะคำนวณค่าความสัมพันธ์ R ^ 2 (ด้วยสูตรเซลล์ Excel (สไตล์ดอทคอมม่าของยุโรป):

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

สำหรับการรวมกันที่เป็นไปได้ที่ไม่ทับซ้อนกันของสองเส้นที่ประกอบเข้าด้วยกัน คู่ที่เป็นไปได้ของค่า R ^ 2 มีกราฟ:

ค่า R ^ 2

คำถามคือสิ่งที่เราควรเลือกคู่ค่า R ^ 2 และเราจะพูดถึงจุดพักหลายจุดตามที่ถามในชื่อเรื่องอย่างไร ทางเลือกหนึ่งคือการเลือกชุดค่าผสมที่ผลรวมของความสัมพันธ์ R-square มากที่สุด พล็อตเรื่องนี้เราได้เส้นโค้งสีน้ำเงินด้านบน:

ผลรวมของ R กำลังสองและส่วนเบี่ยงเบนมาตรฐานของ R กำลังสอง

1,0455

การถดถอยเชิงเส้นอย่างชาญฉลาด - Matlab - จุดพักหลายจุด


1

มีขั้นตอนวิธีการที่ดีงามเป็นที่อธิบายไว้ในตูเมและมิแรนดา (1984)

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

รหัสและ GUI มีทั้งใน Fortran และ IDL จากเว็บไซต์ของพวกเขา: http://www.dfisica.ubi.pt/~artome/linearstep.html


0

... ก่อนอื่นคุณต้องทำโดยทำซ้ำและอยู่ภายใต้เกณฑ์ข้อมูลบางอย่างเช่น AIC AICc BIC Cp; เพราะคุณสามารถรับพอดี "อุดมคติ" ถ้าจำนวน knots K = หมายเลข od ข้อมูลจุด N, ok ... อันดับแรกให้ใส่ K = 0; ประมาณ L = K + 1 การถดถอยคำนวณ AICc เป็นต้น จากนั้นสมมติว่ามีจุดข้อมูลจำนวนน้อยที่สุดที่ส่วนที่แยกต่างหากพูด L = 3 หรือ L = 4 ตกลงตกลง ... ใส่ K = 1; เริ่มต้นจากข้อมูล L-th เป็นปมแรกคำนวณ SS หรือ MLE, ... และดำเนินการตามขั้นตอนต่อไปจุดข้อมูลเป็นปม, SS หรือ MLE จนถึงปมสุดท้ายที่ข้อมูล N - L; เลือกการจัดเรียงที่เหมาะสมที่สุด (SS หรือ MLE) คำนวณ AICc ... ... ใส่ K = 2; ... ใช้การถดถอยก่อนหน้านี้ทั้งหมด (นั่นคือ SS หรือ MLE) แต่แบ่งทีละส่วนเป็นส่วน ๆ ทั้งหมดทีละขั้นตอน ... เลือกการจัดการที่เหมาะสมที่สุด (SS หรือ MLE) คำนวณ AICc ... ถ้า AICc ล่าสุดเกิดขึ้นมากกว่าเดิมก่อนหน้านี้: หยุดการวนซ้ำ! นี่เป็นทางออกที่ดีที่สุดภายใต้เกณฑ์ AICc


AIC, BIC ไม่สามารถใช้งานได้เนื่องจากมีการลงโทษสำหรับพารามิเตอร์เพิ่มเติมซึ่งเห็นได้ชัดว่าไม่ใช่ในกรณีนี้
HelloWorld

0

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

NCI ใช้สำหรับการสร้างแบบจำลองแนวโน้มของอัตราโรคมะเร็งบางทีมันอาจจะเหมาะกับความต้องการของคุณเช่นกัน


0

เพื่อให้พอดีกับข้อมูลฟังก์ชั่นทีละชิ้น:

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

a1,a2,พี1,Q1,พี2,Q2,พี3,Q3

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

ตัวอย่างเช่นด้วยข้อมูลที่ถูกต้องจาก Mats Granvik ผลลัพธ์คือ:

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

หากไม่มีข้อมูลที่กระจัดกระจายตัวอย่างนี้ก็ไม่มีความหมายมากนัก ตัวอย่างอื่นที่มีข้อมูลกระจัดกระจายแสดงอยู่ในเอกสารอ้างอิง


0

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

เว็บไซต์ mcp มีตัวอย่างมากมายที่นำไปใช้เช่น

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)

จากนั้นคุณสามารถเห็นภาพ:

plot(fit)

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

หรือสรุป:

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

ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้พัฒนาของ mcp


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