การถดถอยเชิงเส้นพร้อมข้อ จำกัด ความชัน


18

Rฉันต้องการที่จะดำเนินการถดถอยเชิงเส้นง่ายมากในการ สูตรง่ายเหมือนB อย่างไรก็ตามฉันอยากให้ความชัน ( ) อยู่ในช่วงเวลาสมมติว่าระหว่าง 1.4 ถึง 1.6y=ax+ba

สิ่งนี้สามารถทำได้?

คำตอบ:


24

ฉันต้องการแสดง ... การถดถอยเชิงเส้นในอาร์ ... ฉันอยากให้ความชันอยู่ในช่วงเวลาสมมติว่าระหว่าง 1.4 ถึง 1.6 สิ่งนี้สามารถทำได้?

(i) วิธีง่าย ๆ :

  • เหมาะสมกับการถดถอย ถ้าอยู่ในขอบเขตคุณก็ทำได้

  • หากไม่อยู่ในขอบเขตให้ตั้งค่าความชันเป็นขอบเขตที่ใกล้ที่สุดและ

  • ประมาณค่าดักจับเป็นค่าเฉลี่ยของจากการสังเกตทั้งหมด(Y-ax)

(ii) วิธีที่ซับซ้อนมากขึ้น: ทำสี่เหลี่ยมอย่างน้อยด้วยข้อ จำกัด ของกล่องบนทางลาด ออพติไมซ์ optimizaton หลายตัวใช้ข้อ จำกัด ของกล่องเช่นnlminb(ซึ่งมาพร้อมกับ R)

แก้ไข: จริง ๆ (ตามที่กล่าวไว้ในตัวอย่างด้านล่าง) ใน vanilla R nlsสามารถทำข้อ จำกัด ของกล่องได้ ดังที่แสดงในตัวอย่างมันเป็นเรื่องง่ายมากที่จะทำ

คุณสามารถใช้การถดถอยแบบ จำกัด ได้โดยตรง ฉันคิดว่าpclsฟังก์ชั่นจากแพคเกจ "mgcv" และnnlsฟังก์ชั่นจากแพคเกจ "nnls" ทั้งคู่ทำ

-

แก้ไขเพื่อตอบคำถามติดตาม -

ฉันจะแสดงให้คุณเห็นถึงวิธีการใช้กับnlminbตั้งแต่นั้นมาพร้อมกับ R แต่ฉันรู้ว่าnlsใช้รูทีนเดียวกัน (รูทีน PORT) เพื่อใช้สี่เหลี่ยมจัตุรัสที่มีข้อ จำกัด น้อยที่สุดดังนั้นตัวอย่างของฉันด้านล่างนี้จึงทำ

หมายเหตุ: ในตัวอย่างของฉันด้านล่างคือการสกัดกั้นและbคือความชัน (การประชุมทั่วไปในสถิติ) ฉันรู้ว่าหลังจากที่ฉันใส่ไว้ในที่นี้ที่คุณเริ่มต้นวิธีอื่น ๆ ; แม้ว่าฉันจะทิ้งตัวอย่าง 'ย้อนกลับ' ที่เกี่ยวข้องกับคำถามของคุณa

ก่อนอื่นให้ตั้งค่าข้อมูลด้วยความชัน 'จริง' ภายในช่วง:

 set.seed(seed=439812L)
 x=runif(35,10,30)
 y = 5.8 + 1.53*x + rnorm(35,s=5)  # population slope is in range
 plot(x,y)
 lm(y~x)

Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)            x  
     12.681        1.217  

... แต่ค่าประมาณของ LS นั้นอยู่ข้างนอกมันเกิดจากการเปลี่ยนแปลงแบบสุ่ม ดังนั้นให้ใช้การถดถอยแบบ จำกัด ในnls:

 nls(y~a+b*x,algorithm="port",
   start=c(a=0,b=1.5),lower=c(a=-Inf,b=1.4),upper=c(a=Inf,b=1.6))

Nonlinear regression model
  model: y ~ a + b * x
   data: parent.frame()
    a     b 
9.019 1.400 
 residual sum-of-squares: 706.2

Algorithm "port", convergence message: both X-convergence and relative convergence (5)

อย่างที่คุณเห็นคุณได้ความชันตรงขอบเขต หากคุณส่งโมเดลที่ติดตั้งไปsummaryแล้วมันจะสร้างข้อผิดพลาดมาตรฐานและค่า t แต่ฉันไม่แน่ใจว่าสิ่งเหล่านี้มีความหมาย / ตีความได้อย่างไร

ดังนั้นข้อเสนอแนะของฉัน (1) เปรียบเทียบอย่างไร (เช่นตั้งค่าความชันเป็นขอบเขตที่ใกล้ที่สุดและหาค่าเฉลี่ยเพื่อประมาณค่าจุดตัด)Y-x

 b=1.4
 c(a=mean(y-x*b),b=b)
       a        b 
9.019376 1.400000

มันเป็นค่าประมาณเดียวกัน ...

ในพล็อตด้านล่างเส้นสีน้ำเงินเป็นกำลังสองน้อยที่สุดและเส้นสีแดงคือกำลังสองน้อยที่สุดที่ จำกัด :

ข้อ จำกัด และสาย LS


ขอบคุณสำหรับคำตอบนี้ แต่ ... คุณสามารถยกตัวอย่างโดยใช้ฟังก์ชั่นเหล่านี้ได้หรือไม่?
IñigoHernáez Corres

1
+1 การหาช่วงความเชื่อมั่นในการประมาณพารามิเตอร์จะเป็นสิ่งที่ท้าทายในทุกกรณี
whuber

@ IñigoHernáezCorresดูการอัปเดตคำตอบของฉันซึ่งฉันแสดงให้เห็นว่าใช้nlsเพื่อทำ
Glen_b -Reinstate Monica

+1 คำตอบที่ยอดเยี่ยมด้วยการเชื่อมต่อสองวิธีในการทำ!
Haitao Du

15

วิธีที่สองของ Glen_b การใช้กำลังสองน้อยที่สุดพร้อมกับข้อ จำกัด ของกล่องสามารถนำไปใช้งานได้ง่ายขึ้นผ่านการถดถอยของสันเขา วิธีการแก้ปัญหาการถดถอยสันสามารถมองได้ว่าลากรองจ์สำหรับการถดถอยที่มีขอบเขตความสำคัญของค่าเฉลี่ยของเวกเตอร์น้ำหนัก (และดังนั้นความชัน) ดังนั้นเมื่อทำตามคำแนะนำของ whuber ด้านล่างวิธีการก็คือการลบแนวโน้ม (1.6 + 1.4) / 2 = 1.5 แล้วใช้การถดถอยของสันเขาและค่อยๆเพิ่มพารามิเตอร์สันเขาจนกว่าความชันของความชันจะน้อยกว่าหรือเท่ากับ 0.1

ประโยชน์ของวิธีนี้คือไม่จำเป็นต้องใช้เครื่องมือเพิ่มประสิทธิภาพที่หรูหราเพียงแค่ใช้สันเขาซึ่งมีอยู่แล้วใน R (และแพ็คเกจอื่น ๆ )

อย่างไรก็ตามคำตอบง่ายๆของ Glen_b (i) ดูเหมือนสมเหตุสมผลสำหรับฉัน (+1)


5
นี่ฉลาด แต่คุณแน่ใจหรือว่ามันจะทำงานได้ตามที่อธิบายไว้? สำหรับฉันแล้วแนวทางที่เหมาะสมคือการลบแนวโน้มของ (1.6 + 1.4) / 2 = 1.5 แล้วควบคุมพารามิเตอร์สันเขาจนกว่าค่าสัมบูรณ์ของความชันจะน้อยกว่าหรือเท่ากับ 0.1
whuber

1
ใช่ว่าเป็นข้อเสนอแนะที่ดีกว่า วิธีการถดถอยของสันเขานั้นเหมาะสมกว่าหากมีข้อ จำกัด เกี่ยวกับขนาดของความลาดชันดูเหมือนว่าเป็นปัญหาที่ค่อนข้างแปลก! คำตอบของฉันได้รับแรงบันดาลใจจากความเห็นของ Glen_b เกี่ยวกับข้อ จำกัด ของกล่องการถดถอยของสันเขานั้นเป็นวิธีที่ง่ายกว่าในการใช้ข้อ จำกัด ของกล่อง
Dikran Marsupial

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

แก้ไขเนื้อหาที่ฟุ่มเฟือย แต่ฉันสนุกกับการทำงานร่วมกันและพยายามให้เครดิตแก่ผู้ทำงานร่วมกันที่พวกเขาสมควรได้รับและมักจะคิดว่าคุณสมควรได้รับคะแนนโหวตครึ่งหนึ่ง ; o)
Dikran Marsupial

10

a

มีตัวอย่างจำนวนมากบนเว็บและซอฟต์แวร์ที่ใช้วิธีการแบบเบย์สำหรับการถดถอยคุณก็สามารถทำตามหนึ่งในตัวอย่างเหล่านั้นและเปลี่ยนก่อน ๆ เป็นa

ผลลัพธ์นี้จะยังคงให้ช่วงเวลาที่น่าเชื่อถือของพารามิเตอร์ที่น่าสนใจ (แน่นอนความหมายของช่วงเวลาเหล่านี้จะขึ้นอยู่กับความสมเหตุสมผลของข้อมูลก่อนหน้าของคุณเกี่ยวกับความลาดชัน)


+1 นี่เป็นความคิดแรกของฉันเช่นกัน ฉันชอบคำแนะนำอื่น ๆ แต่นี่ดูเหมือนดีที่สุดสำหรับฉัน
gung - Reinstate Monica

0

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

http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html

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