কেন এনএলএস () আমাকে "প্রাথমিক প্যারামিটারের প্রাক্কালে একবাক্য গ্রেডিয়েন্ট ম্যাট্রিক্স" ত্রুটি দিচ্ছে?


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
প্রকৃতপক্ষে, আমি এটি করেছি এবং সম্পূর্ণ ত্রুটির জন্য আমার অনুসন্ধানে তিনটি ডাটা পয়েন্ট এবং কোনও উত্তর না দিয়ে একটি অর্ধ বেকড প্রশ্ন তৈরি হয়েছিল। তবে আপনার আরও সুনির্দিষ্ট অনুসন্ধানে কিছু ফলাফল পাওয়া যায়। সম্ভবত এখানে আপনার আরও অভিজ্ঞতা রয়েছে এবং কোন শর্তটি প্রাসঙ্গিক হিসাবে দাঁড়িয়েছে তা জানেন know
আমন্ডা

সফ্টওয়্যার ত্রুটি সম্পর্কে আমি একটি জিনিস খুঁজে পেয়েছি তা হল যে নির্দিষ্ট ত্রুটি বার্তার জন্য অনুসন্ধান (সাধারণত উদ্ধৃতি চিহ্নগুলিতে) এটি আগে আলোচনা করা হয়েছিল কিনা তা সন্ধানের নিশ্চিত উপায়। (এটি কেবল এসই সাইটগুলিতে নয়, ইন্টারনেটভিত্তিক রয়েছে)) আমাদের "হোল্ড" বার্তায় যেমন বলা হয়েছে, আপনার অতিরিক্ত গবেষণা যদি আপনার সমস্যা সমাধান না করে, তবে দয়া করে ফিরে আসুন এবং আমাদের দিকে কিছুটা চাপ দিন: এই প্রশ্নটি এখানে রয়েছে পরিসংখ্যান এবং কম্পিউটিংয়ের ছেদ এবং এখানে দুর্দান্ত আগ্রহের কিছু সমস্যা প্রকাশ করতে পারে।
whuber

1
আপনার শুরু মানগুলির জন্য উপযুক্ত তথ্য থেকে খুব দূরে; এক্স = 50 এবং এক্স = 95 এ y- মানগুলির সাথে তুলনা করুন exp(50)এবং করুন exp(95)। যদি আপনি c=0y লগ সেট করে রাখেন (লিনিয়ার সম্পর্ক তৈরি করছেন), আপনি লগ ( ) এবং বি এর প্রাথমিক অনুমানের জন্য রিগ্রেশন ব্যবহার করতে পারেন যা আপনার ডেটার জন্য যথেষ্ট হবে (বা আপনি যদি উত্সের মধ্য দিয়ে একটি লাইনে ফিট করেন তবে আপনি ছেড়ে যেতে পারেন) একটি 1 এবং মাত্র এর আনুমানিক হিসাব ব্যবহার ; যে আপনার ডেটা যথেষ্ট)। যদি অনেক বাহিরে ঐ দুটি মানের কাছাকাছি একটি মোটামুটি সংকীর্ণ ব্যবধান, আপনি কিছু সমস্যায় পরতে হবে। [বিকল্পভাবে একটি আলাদা অ্যালগোরিদমের চেষ্টা করুন]একটিএকটি
Glen_b -Reninstate মনিকা

1
ধন্যবাদ @ গ্লেন_ বি। আমি আশা করছিলাম যে আমি কোনও গ্রাফিকিং ক্যালকুলেটারের পরিবর্তে স্ট্যাটাস ইন্ট্রো পাঠ্যপুস্তকের মাধ্যমে কাজ করতে পারি (এবং কোর্সটি নিজেই লাফফ্রোগ করে) তাই আমি কেবলমাত্র বেস্ট স্ট্যাটিস্টিকাল অন্তর্দৃষ্টি দিয়েই শুরু করছি, তবে আর-তে আরও কাটা এবং ডাইটিং করার অভিজ্ঞতা প্রচুর ।
আমান্ডা

উত্তর:


38

ননলাইনার মডেলের জন্য স্বয়ংক্রিয়ভাবে ভাল শুরুর মান খুঁজে পাওয়া একটি শিল্প। (এটা এক বন্ধ ডেটাসেট যখন আপনি শুধু তথ্য প্লটে বিভক্ত এবং কিছু ভাল অনুমান চাক্ষুষরূপে করতে পারেন। অপেক্ষাকৃত সহজ) একটি পদ্ধতির হয় মডেল রৈখিকরণ এবং লিস্ট স্কোয়ার অনুমান ব্যবহার করুন।

এই ক্ষেত্রে, মডেলটির ফর্ম রয়েছে

(ওয়াই)=একটিমেপুঃ(এক্স)+ +

অজানা পরামিতিগুলির জন্য । সূচকীয় উপস্থিতি আমাদের লোগারিথগুলি ব্যবহার করতে উত্সাহিত করে - তবে এর সংযোজন এটি করা কঠিন করে তোলে। লক্ষ্য করুন, যদিও, যে যদি একটি হয় ইতিবাচক তারপর ক্ষুদ্রতম প্রত্যাশিত মানের চেয়ে কম হবে ওয়াই --and তাই একটু কম ক্ষুদ্রতম চেয়ে হতে পারে পর্যবেক্ষিত মান ওয়াই । (যদি একটি নেতিবাচক হতে পারে তবে আপনাকে সি এর মানও বিবেচনা করতে হবে যা ওয়াইয়ের বৃহত্তম পর্যবেক্ষিত মানের তুলনায় কিছুটা বড় ))একটি,,একটিওয়াইওয়াইএকটিওয়াই

তা হলে, আসুন যত্ন নিতে যাক যেমন প্রাথমিক অনুমান ব্যবহার করে 0 পর্যবেক্ষণ অর্ধেক ন্যূনতম ভালো কিছু Y আমি । সেই কাঁটাযুক্ত সংযোজনীয় শব্দটি বাদে এখন মডেলটি আবারও লেখা যেতে পারে0Yআমি

(ওয়াই)-0একটিমেপুঃ(এক্স)

যে আমরা লগ নিতে পারেন:

লগ((ওয়াই)-0)লগ(একটি)+ +এক্স

এটি মডেলের লিনিয়ার আনুমানিক। উভয় এবং বিকমপক্ষে স্কোয়ার দিয়ে অনুমান করা যায়।লগ(একটি)

সংশোধিত কোডটি এখানে:

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)

ব্যক্তিত্ব

এটা ভাল কাজ!

এটি স্বয়ংক্রিয়করণ করার সময়, আপনি অবশিষ্টাংশগুলির কিছু দ্রুত বিশ্লেষণ করতে পারেন যেমন ( ) ডেটা ছড়িয়ে দেওয়ার সাথে তাদের চূড়ান্ত তুলনা করতে । সম্ভাবনাটি মোকাবেলা করার জন্য আপনার অ্যানালগাস কোডও লাগতে পারে aY ; আমি একটি অনুশীলন হিসাবে ছেড়ে।একটি<0


প্রাথমিক মানগুলি অনুমান করার জন্য অন্য একটি পদ্ধতি তাদের অর্থ বোঝার উপর নির্ভর করে, যা যা অভিজ্ঞতা, শারীরিক তত্ত্ব ইত্যাদির উপর ভিত্তি করে তৈরি করা যেতে পারে a এ /stats//a/15769

স্ক্রেটারপ্লোটের ভিজ্যুয়াল বিশ্লেষণ (প্রাথমিক প্যারামিটারের অনুমানগুলি নির্ধারণ করতে) /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এখন ডাকা হবে বলে মনে হচ্ছে ।
ম্যাট

-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
এটি আপনার জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না - এটি একে অন্যরকম পরিবর্তিত করে (এবং কম আকর্ষণীয়, আইএমএইচও) করে।
whuber

6
যদিও এটি উপাত্ত উপস্থাপনের জন্য কোনও ফাংশন ফিটিংয়ের সমস্যার সমাধান করতে পারে, আপনার গৃহীত উত্তরগুলি আপনার প্রশ্নের প্রত্যাশা নয়। মিঃ @ হুইবার আপনাকে একটি দুর্দান্ত ব্যাখ্যা সরবরাহ করেছেন এবং গৃহীত উত্তরটির প্রাপ্য।
লোরেনকো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.