R
ฉันต้องการที่จะดำเนินการถดถอยเชิงเส้นง่ายมากในการ สูตรง่ายเหมือนB อย่างไรก็ตามฉันอยากให้ความชัน ( ) อยู่ในช่วงเวลาสมมติว่าระหว่าง 1.4 ถึง 1.6
สิ่งนี้สามารถทำได้?
R
ฉันต้องการที่จะดำเนินการถดถอยเชิงเส้นง่ายมากในการ สูตรง่ายเหมือนB อย่างไรก็ตามฉันอยากให้ความชัน ( ) อยู่ในช่วงเวลาสมมติว่าระหว่าง 1.4 ถึง 1.6
สิ่งนี้สามารถทำได้?
คำตอบ:
ฉันต้องการแสดง ... การถดถอยเชิงเส้นในอาร์ ... ฉันอยากให้ความชันอยู่ในช่วงเวลาสมมติว่าระหว่าง 1.4 ถึง 1.6 สิ่งนี้สามารถทำได้?
(i) วิธีง่าย ๆ :
เหมาะสมกับการถดถอย ถ้าอยู่ในขอบเขตคุณก็ทำได้
หากไม่อยู่ในขอบเขตให้ตั้งค่าความชันเป็นขอบเขตที่ใกล้ที่สุดและ
ประมาณค่าดักจับเป็นค่าเฉลี่ยของจากการสังเกตทั้งหมด
(ii) วิธีที่ซับซ้อนมากขึ้น: ทำสี่เหลี่ยมอย่างน้อยด้วยข้อ จำกัด ของกล่องบนทางลาด ออพติไมซ์ optimizaton หลายตัวใช้ข้อ จำกัด ของกล่องเช่นnlminb
(ซึ่งมาพร้อมกับ R)
แก้ไข: จริง ๆ (ตามที่กล่าวไว้ในตัวอย่างด้านล่าง) ใน vanilla R nls
สามารถทำข้อ จำกัด ของกล่องได้ ดังที่แสดงในตัวอย่างมันเป็นเรื่องง่ายมากที่จะทำ
คุณสามารถใช้การถดถอยแบบ จำกัด ได้โดยตรง ฉันคิดว่าpcls
ฟังก์ชั่นจากแพคเกจ "mgcv" และnnls
ฟังก์ชั่นจากแพคเกจ "nnls" ทั้งคู่ทำ
-
แก้ไขเพื่อตอบคำถามติดตาม -
ฉันจะแสดงให้คุณเห็นถึงวิธีการใช้กับnlminb
ตั้งแต่นั้นมาพร้อมกับ R แต่ฉันรู้ว่าnls
ใช้รูทีนเดียวกัน (รูทีน PORT) เพื่อใช้สี่เหลี่ยมจัตุรัสที่มีข้อ จำกัด น้อยที่สุดดังนั้นตัวอย่างของฉันด้านล่างนี้จึงทำ
หมายเหตุ: ในตัวอย่างของฉันด้านล่างคือการสกัดกั้นและbคือความชัน (การประชุมทั่วไปในสถิติ) ฉันรู้ว่าหลังจากที่ฉันใส่ไว้ในที่นี้ที่คุณเริ่มต้นวิธีอื่น ๆ ; แม้ว่าฉันจะทิ้งตัวอย่าง 'ย้อนกลับ' ที่เกี่ยวข้องกับคำถามของคุณ
ก่อนอื่นให้ตั้งค่าข้อมูลด้วยความชัน 'จริง' ภายในช่วง:
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) เปรียบเทียบอย่างไร (เช่นตั้งค่าความชันเป็นขอบเขตที่ใกล้ที่สุดและหาค่าเฉลี่ยเพื่อประมาณค่าจุดตัด)
b=1.4
c(a=mean(y-x*b),b=b)
a b
9.019376 1.400000
มันเป็นค่าประมาณเดียวกัน ...
ในพล็อตด้านล่างเส้นสีน้ำเงินเป็นกำลังสองน้อยที่สุดและเส้นสีแดงคือกำลังสองน้อยที่สุดที่ จำกัด :
nls
เพื่อทำ
วิธีที่สองของ Glen_b การใช้กำลังสองน้อยที่สุดพร้อมกับข้อ จำกัด ของกล่องสามารถนำไปใช้งานได้ง่ายขึ้นผ่านการถดถอยของสันเขา วิธีการแก้ปัญหาการถดถอยสันสามารถมองได้ว่าลากรองจ์สำหรับการถดถอยที่มีขอบเขตความสำคัญของค่าเฉลี่ยของเวกเตอร์น้ำหนัก (และดังนั้นความชัน) ดังนั้นเมื่อทำตามคำแนะนำของ whuber ด้านล่างวิธีการก็คือการลบแนวโน้ม (1.6 + 1.4) / 2 = 1.5 แล้วใช้การถดถอยของสันเขาและค่อยๆเพิ่มพารามิเตอร์สันเขาจนกว่าความชันของความชันจะน้อยกว่าหรือเท่ากับ 0.1
ประโยชน์ของวิธีนี้คือไม่จำเป็นต้องใช้เครื่องมือเพิ่มประสิทธิภาพที่หรูหราเพียงแค่ใช้สันเขาซึ่งมีอยู่แล้วใน R (และแพ็คเกจอื่น ๆ )
อย่างไรก็ตามคำตอบง่ายๆของ Glen_b (i) ดูเหมือนสมเหตุสมผลสำหรับฉัน (+1)
มีตัวอย่างจำนวนมากบนเว็บและซอฟต์แวร์ที่ใช้วิธีการแบบเบย์สำหรับการถดถอยคุณก็สามารถทำตามหนึ่งในตัวอย่างเหล่านั้นและเปลี่ยนก่อน ๆ เป็น
ผลลัพธ์นี้จะยังคงให้ช่วงเวลาที่น่าเชื่อถือของพารามิเตอร์ที่น่าสนใจ (แน่นอนความหมายของช่วงเวลาเหล่านี้จะขึ้นอยู่กับความสมเหตุสมผลของข้อมูลก่อนหน้าของคุณเกี่ยวกับความลาดชัน)
อีกวิธีหนึ่งคือการปรับรูปแบบการถดถอยของคุณให้เป็นปัญหาการเพิ่มประสิทธิภาพและใช้เครื่องมือเพิ่มประสิทธิภาพ ฉันไม่แน่ใจว่าจะสามารถปรับปรุงรูปแบบนี้ได้หรือไม่ แต่ฉันคิดถึงคำถามนี้เมื่อฉันอ่านบล็อกนี้ที่โพสต์บนตัวเพิ่มประสิทธิภาพ R:
http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html