รับค่าเริ่มต้นที่ถูกต้องสำหรับโมเดล nls ใน R


13

ฉันกำลังพยายามจัดทำแบบจำลองกฎหมายพลังงานอย่างง่ายกับชุดข้อมูลที่เป็นดังนี้:

mydf:

rev     weeks
17906.4 1
5303.72 2
2700.58 3
1696.77 4
947.53  5
362.03  6

เป้าหมายคือการส่งผ่านสายไฟฟ้าและใช้มันเพื่อทำนายrevvlaues สำหรับสัปดาห์ต่อ ๆ ไป มีงานวิจัยมากมายพาฉันไปที่nlsฟังก์ชั่นซึ่งฉันได้ปฏิบัติดังนี้

newMod <- nls(rev ~ a*weeks^b, data=modeldf, start = list(a=1,b=1))
predict(newMod, newdata = data.frame(weeks=c(1,2,3,4,5,6,7,8,9,10)))

ในขณะที่งานนี้สำหรับlmรุ่นที่ผมได้รับsingular gradientข้อผิดพลาดที่ผมเข้าใจจะทำอย่างไรกับค่าเริ่มต้นของฉันและa bฉันลองใช้ค่าที่แตกต่างกันไปจนถึงการพล็อตเรื่องนี้ใน Excel ผ่าน lone รับสมการจากนั้นใช้ค่าจากสมการ แต่ฉันยังคงได้รับข้อผิดพลาด ฉันดูคำตอบจำนวนมากเช่นนี้และลองคำตอบที่สอง (ไม่เข้าใจคำตอบแรก) แต่ไม่มีผลลัพธ์

ฉันสามารถใช้ความช่วยเหลือบางอย่างที่นี่เกี่ยวกับวิธีค้นหาค่าเริ่มต้นที่ถูกต้อง หรือมิฉะนั้นฉันสามารถใช้ฟังก์ชั่นอื่นแทน nls ได้

ในกรณีที่คุณต้องการสร้างใหม่mydfได้อย่างง่ายดาย:

mydf <- data.frame(rev=c(17906.4, 5303.72, 2700.58 ,1696.77 ,947.53 ,362.03), weeks=c(1,2,3,4,5,6)) 

1
แม้ว่าจะระบุไว้ในรูปของ R (จริงๆต้องมีการระบุไว้ในบางภาษา) วิธีการหาค่าเริ่มต้นที่เหมาะสมสำหรับแบบจำลองที่ไม่ใช่เชิงเส้นนั้นเป็นสถิติที่เพียงพอที่จะอยู่ในหัวข้อที่นี่ IMO มันไม่ใช่การเขียนโปรแกรม Q จริงๆ
gung - Reinstate Monica

คำตอบ:


14

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

เข้าสู่ระบบ(a)

a

 newMod <- nls(rev ~ a*weeks^b, data=mydf, start = list(a=exp(9.947),b=-2.011))
 predict(newMod, newdata = data.frame(weeks=c(1,2,3,4,5,6,7,8,9,10)))
 [1] 17919.2138  5280.7001  2584.0109  1556.1951  1050.1230   761.4947   580.3091   458.6027
 [9]   372.6231   309.4658

นั่นเป็นประโยชน์อย่างมากขอบคุณมาก! ฉันมีคำถามเกี่ยวกับวิธีที่คุณได้รับคุณค่า "a" ที่นี่ ฉันลองใช้ lm (log10 (rev) ~ log10 (สัปดาห์)) แล้วใช้ฟังก์ชั่น "สรุป" และในขณะที่ฉันได้รับค่า "b" เดียวกันค่า "a" ของฉันจะออกมาเป็น 4.3201 คุณทำอะไรที่แตกต่างไปถึง a = 9.947
NeonBlueHair

explogอี

อ่าคุณพูดถูก ความผิดพลาดในการสมัครเล่นในส่วนของฉัน คิดแบบสัญกรณ์คณิตศาสตร์ที่คาดหวังว่า "บันทึก" เพื่อหมายถึง log ฐาน 10 และ "ln" สำหรับบันทึกธรรมชาติ ขอขอบคุณสำหรับการชี้แจง.
NeonBlueHair

1
สำหรับนักคณิตศาสตร์หลายคน (และนักสถิติจำนวนมาก) "ท่อนไม้" ที่ไม่มีเครื่องตกแต่งนั้นเป็นท่อนไม้ตามธรรมชาติซึ่งเป็นข้อโต้แย้งที่ไม่มีการตกแต่งให้ทำหน้าที่บาปอยู่ในเรเดียน [อนุสัญญาการปะทะกันอาจนำไปสู่ความสับสนโชคไม่ดี แต่เมื่อฉันเริ่มใช้ R ฉันไม่คิดสองครั้งเกี่ยวกับการใช้ฟังก์ชั่นบันทึกตั้งแต่ R และฉันใช้แบบแผนเดียวกัน]
Glen_b

4

ลอง

 newMod <- nls(rev ~ a*weeks^b, data=mydf, startlist(a=17919.2127344,b=-1.76270557120))

ฉันถูกขอให้ขยายคำตอบนี้เล็กน้อย ปัญหานี้ง่ายมากฉันประหลาดใจที่ nls ล้มเหลว ปัญหาที่แท้จริงคือการใช้แนวทาง R และปรัชญาของการปรับตัวแบบไม่เชิงเส้น ในโลกแห่งความเป็นจริงเราจะปรับขนาด x ให้อยู่ระหว่าง -1 ถึง 1 และ y และ y เพื่อให้อยู่ระหว่าง 0 ถึง 1 (y = ax ^ ^) นั่นอาจจะเพียงพอที่จะให้ nls มาบรรจบกัน แน่นอนว่าเกลนชี้ให้เห็นว่าคุณสามารถใส่โมเดลเชิงเส้นตรงได้ นั่นขึ้นอยู่กับความจริงที่ว่ามีการเปลี่ยนแปลงอย่างง่ายซึ่งทำให้โมเดลเป็นเชิงเส้น มักจะไม่เป็นเช่นนั้น ปัญหาเกี่ยวกับรูทีน R อย่าง nls คือพวกเขาไม่ได้ให้การสนับสนุนสำหรับการกำหนดรูปแบบพารามิเตอร์ใหม่ ในกรณีนี้ reparameterization นั้นง่ายเพียง rescale / latestre x และ y อย่างไรก็ตามการมีโมเดลให้เหมาะสมผู้ใช้จะมีพารามิเตอร์ a และ b แตกต่างจากแบบดั้งเดิม ในขณะที่มันง่ายในการคำนวณค่าดั้งเดิมจากสิ่งเหล่านี้ แต่ปัญหาอื่น ๆ คือมันไม่ง่ายนักที่จะได้ค่าเบี่ยงเบนมาตรฐานโดยประมาณสำหรับการประมาณค่าพารามิเตอร์เหล่านี้ สิ่งนี้ทำได้โดยวิธีเดลต้าซึ่งเกี่ยวข้องกับ Hessian ของบันทึกความน่าจะเป็นและอนุพันธ์บางอย่าง ซอฟต์แวร์การประเมินพารามิเตอร์ที่ไม่เชิงเส้นควรให้การคำนวณเหล่านี้โดยอัตโนมัติเพื่อให้การสนับสนุนการแก้ไขพารามิเตอร์ของโมเดลทำได้อย่างง่ายดาย สิ่งที่ซอฟต์แวร์ควรสนับสนุนก็คือแนวคิดของเฟส คุณสามารถนึกถึงการปรับโมเดลให้เหมาะสมกับรุ่นของ Glen ในขั้นตอนที่ 1 โมเดล "ของจริง" นั้นเหมาะสมในขั้นตอนที่ 2 ปัญหาอื่น ๆ คือมันไม่ง่ายนักที่จะได้ค่าเบี่ยงเบนมาตรฐานโดยประมาณสำหรับการประมาณพารามิเตอร์เหล่านี้ สิ่งนี้ทำได้โดยวิธีเดลต้าซึ่งเกี่ยวข้องกับ Hessian ของบันทึกความน่าจะเป็นและอนุพันธ์บางอย่าง ซอฟต์แวร์การประเมินพารามิเตอร์ที่ไม่เชิงเส้นควรให้การคำนวณเหล่านี้โดยอัตโนมัติเพื่อให้การสนับสนุนการแก้ไขพารามิเตอร์ของโมเดลทำได้อย่างง่ายดาย สิ่งที่ซอฟต์แวร์ควรสนับสนุนก็คือแนวคิดของเฟส คุณสามารถนึกถึงการปรับโมเดลให้เหมาะสมกับรุ่นของ Glen ในขั้นตอนที่ 1 โมเดล "ของจริง" นั้นเหมาะสมในขั้นตอนที่ 2 ปัญหาอื่น ๆ คือมันไม่ง่ายนักที่จะได้ค่าเบี่ยงเบนมาตรฐานโดยประมาณสำหรับการประมาณพารามิเตอร์เหล่านี้ สิ่งนี้ทำได้โดยวิธีเดลต้าซึ่งเกี่ยวข้องกับ Hessian ของบันทึกความน่าจะเป็นและอนุพันธ์บางอย่าง ซอฟต์แวร์การประเมินพารามิเตอร์ที่ไม่เชิงเส้นควรให้การคำนวณเหล่านี้โดยอัตโนมัติเพื่อให้การสนับสนุนการแก้ไขพารามิเตอร์ของโมเดลทำได้อย่างง่ายดาย สิ่งที่ซอฟต์แวร์ควรสนับสนุนก็คือแนวคิดของเฟส คุณสามารถนึกถึงการปรับโมเดลให้เหมาะสมกับรุ่นของ Glen ในขั้นตอนที่ 1 โมเดล "ของจริง" นั้นเหมาะสมในขั้นตอนที่ 2 ซอฟต์แวร์การประเมินพารามิเตอร์ที่ไม่เชิงเส้นควรให้การคำนวณเหล่านี้โดยอัตโนมัติเพื่อให้การสนับสนุนการแก้ไขพารามิเตอร์ของโมเดลทำได้อย่างง่ายดาย สิ่งที่ซอฟต์แวร์ควรสนับสนุนก็คือแนวคิดของเฟส คุณสามารถนึกถึงการปรับโมเดลให้เหมาะสมกับรุ่นของ Glen ในขั้นตอนที่ 1 โมเดล "ของจริง" นั้นเหมาะสมในขั้นตอนที่ 2 ซอฟต์แวร์การประเมินพารามิเตอร์ที่ไม่เชิงเส้นควรให้การคำนวณเหล่านี้โดยอัตโนมัติเพื่อให้การสนับสนุนการแก้ไขพารามิเตอร์ของโมเดลทำได้อย่างง่ายดาย สิ่งที่ซอฟต์แวร์ควรสนับสนุนก็คือแนวคิดของเฟส คุณสามารถนึกถึงการปรับโมเดลให้เหมาะสมกับรุ่นของ Glen ในขั้นตอนที่ 1 โมเดล "ของจริง" นั้นเหมาะสมในขั้นตอนที่ 2

ฉันพอดีกับโมเดลของคุณด้วย AD Model Builder ซึ่งรองรับเฟสได้อย่างเป็นธรรมชาติ ในระยะแรกเท่านั้นประมาณ นี่ทำให้โมเดลของคุณกลายเป็นสนามเบสบอล ในระยะที่สอง a และ b คาดว่าจะได้รับการแก้ปัญหา AD Model Builder คำนวณค่าเบี่ยงเบนมาตรฐานโดยอัตโนมัติสำหรับฟังก์ชั่นใด ๆ ของพารามิเตอร์โมเดลผ่านวิธีการเดลต้าเพื่อให้การสนับสนุนการแก้ไขพารามิเตอร์ของโมเดลมีความเสถียร


2

อัลกอริทึม Levenberg-Marquardt สามารถช่วย:

modeldf <- data.frame(rev=c(17906.4, 5303.72, 2700.58 ,1696.77 ,947.53 ,362.03), weeks=c(1,2,3,4,5,6))

require(minpack.lm)
fit <- nlsLM(rev ~ a*weeks^b, data=modeldf, start = list(a=1,b=1))

require(broom)
fit_data <- augment(fit)

plot(.fitted~rev, data=fit_data)

1

จากประสบการณ์ของฉันวิธีที่ดีในการค้นหาค่าเริ่มต้นสำหรับพารามิเตอร์ของโมเดล NLR คือการใช้อัลกอริทึมวิวัฒนาการ จากประชากรเริ่มต้น (100) ของการประมาณการแบบสุ่ม (ผู้ปกครอง) ในพื้นที่การค้นหาเลือก 20 (ลูก) ที่ดีที่สุดและใช้สิ่งเหล่านี้เพื่อช่วยกำหนดการค้นหาในประชากรที่ประสบความสำเร็จ ทำซ้ำจนกระทั่งมาบรรจบกัน ไม่จำเป็นต้องไล่ระดับสีหรือ hessians เพียงแค่ประเมิน SSE หากคุณไม่โลภมากเกินไปสิ่งนี้มักจะได้ผล ปัญหาที่คนมักจะมีคือพวกเขาใช้การค้นหาในท้องถิ่น (Newton-Raphson) เพื่อทำงานของการค้นหาทั่วโลก เช่นเคยมันเป็นเรื่องของการใช้เครื่องมือที่ถูกต้องสำหรับงานในมือ มันสมเหตุสมผลกว่าที่จะใช้การค้นหาทั่วโลกของ EA เพื่อค้นหาค่าเริ่มต้นสำหรับการค้นหาในท้องถิ่นของนิวตันจากนั้นปล่อยให้สิ่งนี้ต่ำลง แต่เช่นเดียวกับทุกสิ่งปีศาจอยู่ในรายละเอียด

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