เหตุใด nls () ให้ข้อผิดพลาด“ เมตริกซ์การไล่ระดับสีเอกพจน์ที่ประมาณการพารามิเตอร์เริ่มต้น” ให้ฉัน


21

ฉันมีข้อมูลพื้นฐานเกี่ยวกับการลดการปล่อยก๊าซและราคาต่อคัน:

q24 <- read.table(text = "reductions  cost.per.car
    50  45
    55  55
    60  62
    65  70
    70  80
    75  90
    80  100
    85  200
    90  375
    95  600
    ",header = TRUE, sep = "")

ฉันรู้ว่านี่เป็นฟังก์ชั่นเอ็กซ์โปเนนเชียลดังนั้นฉันคาดหวังว่าจะสามารถหาแบบจำลองที่เหมาะกับ:

    model <- nls(cost.per.car ~ a * exp(b * reductions) + c, 
         data = q24, 
         start = list(a=1, b=1, c=0))

แต่ฉันได้รับข้อผิดพลาด:

Error in nlsModel(formula, mf, start, wts) : 
  singular gradient matrix at initial parameter estimates

ผมเคยอ่านผ่านทางตันของคำถามเกี่ยวกับข้อผิดพลาดฉันเห็นและฉันรวบรวมว่าปัญหาน่าจะเป็นที่ฉันต้องดีกว่า / ที่แตกต่างกันstartค่า (คนinitial parameter estimatesที่ทำให้ความรู้สึกเล็ก ๆ น้อย ๆ ) แต่ผมไม่แน่ใจว่าได้รับ ข้อมูลที่ฉันมีฉันจะประเมินค่าพารามิเตอร์ที่ดีขึ้นอย่างไร


ฉันขอแนะนำให้เริ่มต้นการถอดรหัสของคุณโดยการค้นหาเว็บไซต์ของเราสำหรับข้อผิดพลาด
whuber

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

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

1
ความพอดีสำหรับค่าเริ่มต้นของคุณอยู่ไกลจากข้อมูลมาก เปรียบเทียบexp(50)และexp(95)การ y ที่ค่าที่ x = 50 x = 95 หากคุณตั้งค่าc=0และใช้บันทึกของ y (สร้างความสัมพันธ์เชิงเส้น) คุณสามารถใช้การถดถอยเพื่อรับค่าประมาณเริ่มต้นสำหรับบันทึก ( ) และbที่เพียงพอสำหรับข้อมูลของคุณ (หรือถ้าคุณพอดีกับเส้นผ่านจุดกำเนิดคุณสามารถออกได้วันที่ 1 และใช้เพียงการประมาณการสำหรับนั่นยังพอเพียงสำหรับข้อมูลของคุณ) หากbอยู่นอกช่วงเวลาที่แคบมากรอบค่าสองค่าเหล่านั้นคุณจะพบปัญหาบางอย่าง [หรือลองใช้อัลกอริธึมที่ต่างออกไป]ababb
Glen_b -Reinstate Monica

1
ขอบคุณ @Glen_b ฉันหวังว่าฉันจะสามารถใช้ R แทนเครื่องคิดเลขกราฟเพื่อทำงานผ่านตำราแนะนำสถิติ (และก้าวกระโดดของหลักสูตรเอง) ดังนั้นฉันจึงเริ่มต้นด้วยข้อมูลเชิงสถิติที่ชัดเจนที่สุด แต่ประสบการณ์มากมายในการทำ slicing และ dicing ใน R .
Amanda

คำตอบ:


38

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

ในกรณีนี้แบบจำลองมีแบบฟอร์ม

E(Y)=aexp(bx)+c

สำหรับพารามิเตอร์ที่ไม่รู้จัก, , การมีอยู่ของเลขชี้กำลังนั้นกระตุ้นให้เราใช้ลอการิทึม - แต่การเติมcทำให้ยากที่จะทำเช่นนั้น สังเกตว่าถ้าaเป็นบวกดังนั้นcจะน้อยกว่าค่าที่คาดหวังน้อยที่สุดของY - และอาจน้อยกว่าค่าที่สังเกตได้น้อยที่สุดของYเล็กน้อย (หากaอาจเป็นลบคุณจะต้องพิจารณาค่าcที่มากกว่าค่าสังเกตที่ใหญ่ที่สุดของYเล็กน้อย)a,b,ccacYYacY

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

E(Y)c0aexp(bx).

ที่เราสามารถนำบันทึกของ:

log(E(Y)c0)log(a)+bx.

นั่นคือการประมาณเชิงเส้นของโมเดล ทั้งและbสามารถประมาณได้ด้วยกำลังสองน้อยที่สุดlog(a)b

นี่คือรหัสที่แก้ไข:

c.0 <- min(q24$cost.per.car) * 0.5
model.0 <- lm(log(cost.per.car - c.0) ~ reductions, data=q24)
start <- list(a=exp(coef(model.0)[1]), b=coef(model.0)[2], c=c.0)
model <- nls(cost.per.car ~ a * exp(b * reductions) + c, data = q24, start = start)

เอาท์พุทมัน (สำหรับข้อมูลตัวอย่าง) คือ

Nonlinear regression model
  model: cost.per.car ~ a * exp(b * reductions) + c
   data: q24
        a         b         c 
 0.003289  0.126805 48.487386 
 residual sum-of-squares: 2243

Number of iterations to convergence: 38 
Achieved convergence tolerance: 1.374e-06

การบรรจบกันดูดี มาวางแผนกัน

plot(q24)
p <- coef(model)
curve(p["a"] * exp(p["b"] * x) + p["c"], lwd=2, col="Red", add=TRUE)

รูป

มันทำงานได้ดี!

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


อีกวิธีหนึ่งในการประมาณค่าเริ่มต้นนั้นขึ้นอยู่กับการทำความเข้าใจความหมายของสิ่งเหล่านี้ซึ่งอาจขึ้นอยู่กับประสบการณ์ทฤษฎีทางกายภาพฯลฯ ตัวอย่างเพิ่มเติมของแบบไม่เชิงเส้น (ยากปานกลาง) ซึ่งสามารถกำหนดค่าเริ่มต้นด้วยวิธีนี้ได้ ที่/stats//a/15769

การวิเคราะห์ภาพของ scatterplot (เพื่อตรวจสอบประมาณการพารามิเตอร์เริ่มต้น) มีการอธิบายและภาพประกอบที่/stats//a/32832

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


2

ห้องสมุดนี้สามารถแก้ไขปัญหาของฉันกับของ nls singular gradient: http://www.r-bloggers.com/a-better-nls/ ตัวอย่าง:

library(minpack.lm)
nlsLM(function, start=list(variable=2,variable2=12))

ฟังก์ชั่นนั้นดูเหมือนจะถูกเรียกnls.lmตอนนี้
Matt

-1

ดังนั้น ... ฉันคิดว่าฉันอ่านมันผิดเป็นฟังก์ชันเลขชี้กำลัง ทั้งหมดที่ฉันต้องการคือpoly()

model <- lm(cost.per.car ~ poly(reductions, 3), data=q24)
new.data <- data.frame(reductions = c(91,92,93,94))
predict(model, new.data)

plot(q24)
lines(q24$reductions, predict(model, list(reductions = q24$reductions)))

หรือใช้lattice:

xyplot(cost.per.car ~ reductions, data = q24,
       panel = function(x, y) {
         panel.xyplot(x, y)
         panel.lines(x, predict(model,list(reductions = x) ))
       }, 
       xlab = "Reductions", 
       ylab = "Cost per car")

2
สิ่งนี้ไม่ตอบคำถามที่คุณถาม - มันเปลี่ยนเป็นสิ่งที่แตกต่าง (และค่อนข้างน่าสนใจน้อยกว่า IMHO)
whuber

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