Отримання правильних вихідних значень для nls-моделі в R


13

Я намагаюся пристосувати просту модель закону про владу до набору даних таким чином:

mydf:

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

Мета полягає в тому, щоб пропустити лінію електропередачі і використовувати її для прогнозування revвластей на майбутні тижні. Купка досліджень привела мене до 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, пройти одиноку, отримати рівняння, потім використати значення з рівняння, але я все одно отримую помилку. Я переглянув купу відповідей на кшталт цієї і спробував другу відповідь (не зміг зрозуміти першу), але безрезультатно.

Я дійсно міг би скористатися деякою допомогою тут, як знайти правильні вихідні значення. Або в якості альтернативи, яку іншу функцію я можу використовувати замість 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 (це дійсно має бути зазначено якоюсь мовою), як знайти відповідні вихідні значення для нелінійної моделі, є достатньо статистичним, щоб бути актуальним тут, ІМО. Це насправді не Q-програмування, наприклад.
gung - Відновіть Моніку

Відповіді:


14

Це поширена проблема з нелінійними моделями найменших квадратів; якщо ваші початкові значення дуже далекі від оптимальних, алгоритм може не збігатися, навіть незважаючи на те, що він може вести себе поблизу від оптимального.

Якщо ви почнете робити логи з обох сторін і підходити до лінійної моделі, ви отримуєте оцінки і як нахил і перехоплення (9.947 і -2.011) (редагувати: це природний журнал)blog(a)b

Якщо ви використовуєте ці для керування вихідними значеннями для і все, здається, працює нормально:bab

 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. Що ви зробили по-іншому, щоб досягти а = 9,947?
NeonBlueHair

Зауважте, що я використовував expйого для повернення до невідомих значень, що є підказкою, що вказує на те, що я використовував звичайну logфункцію. Поки ви будете узгоджуватись із тим, який журнал та антилог ви використовуєте, ви отримаєте ту саму відповідь для початкового значення. Таким чином, ви можете зробити базу 10, і я можу зробити базу і все те саме. e
Glen_b -Встановіть Моніку

Ах, ви абсолютно праві. Аматорська помилка з мого боку. Досліджував математичні позначення, очікуючи, що "log" буде означати базу журналу 10 та "ln" для природного журналу. Дякуємо за роз’яснення.
NeonBlueHair

1
Для багатьох математиків (і багатьох статистиків) природний журнал - це неприхований "журнал", настільки ж, як неприхований аргумент функції гріха є в радіанах. [Збір конвенцій може призвести до плутанини, на жаль, але, наприклад, коли я почав використовувати R, я не замислювався двічі про використання функції журналу, оскільки R, і я
поділяюсь однаковою умовою

4

Спробуйте

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

Мене попросили трохи розширити цю відповідь. Ця проблема настільки проста, що я настільки здивований, що nls не вдається. Однак справжня проблема полягає у всьому підході R та філософії нелінійної підгонки моделі. У реальному світі можна розмістити х, щоб лежати між -1 і 1, а y і y, щоб лежати між 0 an 1 (y = ax ^ b). Цього, мабуть, буде достатньо, щоб зблизити nls. Звичайно, як зазначає Глен, ви можете підходити до відповідної лінійної лінійної моделі. Це спирається на те, що існує проста трансформація, яка лінеаризує модель. Це часто не так. Проблема з R-процедурами на зразок nls полягає в тому, що вони не пропонують підтримки для перемаралізації моделі. У цьому випадку репараметрізація проста, просто змінити масштаб / recentre x і y. Однак, підходивши до моделі, користувач матиме різні параметри a і b від початкових. Незважаючи на те, що обчислити вихідні з них просто, інша складність полягає в тому, що в цілому не так просто отримати оцінені стандартні відхилення для цих оцінок параметрів. Це робиться дельтовим методом, який включає в себе гессіанства вірогідності журналу та деяких похідних. Програмне забезпечення для нелінійної оцінки параметрів повинно подавати ці обчислення автоматично, щоб легко підтримувати репараметризацію моделі. Інша річ, яку програмне забезпечення повинно підтримувати - це поняття фаз. Ви можете подумати про те, щоб спочатку пристосувати модель до версії Глена як фазу 1. "Справжня" модель підходить на другому етапі. інша складність полягає в тому, що в цілому не так просто отримати оцінені стандартні відхилення для цих оцінок параметрів. Це робиться дельтовим методом, який включає в себе гессіанства вірогідності журналу та деяких похідних. Програмне забезпечення для нелінійної оцінки параметрів повинно подавати ці обчислення автоматично, щоб легко підтримувати репараметризацію моделі. Інша річ, яку програмне забезпечення повинно підтримувати - це поняття фаз. Ви можете подумати про те, щоб спочатку пристосувати модель до версії Глена як фазу 1. "Справжня" модель підходить на другому етапі. інша складність полягає в тому, що в цілому не так просто отримати оцінені стандартні відхилення для цих оцінок параметрів. Це робиться дельтовим методом, який включає в себе гессіанства вірогідності журналу та деяких похідних. Програмне забезпечення для нелінійної оцінки параметрів повинно подавати ці обчислення автоматично, щоб легко підтримувати репараметризацію моделі. Інша річ, яку програмне забезпечення повинно підтримувати - це поняття фаз. Ви можете подумати про те, щоб спочатку пристосувати модель до версії Глена як фазу 1. "Справжня" модель підходить на другому етапі. Програмне забезпечення для нелінійної оцінки параметрів повинно подавати ці обчислення автоматично, щоб легко підтримувати репараметризацію моделі. Інша річ, яку програмне забезпечення повинно підтримувати - це поняття фаз. Ви можете подумати про те, щоб спочатку пристосувати модель до версії Глена як фазу 1. "Справжня" модель підходить на другому етапі. Програмне забезпечення для нелінійної оцінки параметрів повинно подавати ці обчислення автоматично, щоб легко підтримувати репараметризацію моделі. Інша річ, яку програмне забезпечення повинно підтримувати - це поняття фаз. Ви можете подумати про те, щоб спочатку пристосувати модель до версії Глена як фазу 1. "Справжня" модель підходить на другому етапі.

Я підходить до вашої моделі з AD Model Builder, який підтримує фази природним чином. На першій фазі було оцінено лише а. Це перетворює вашу модель на бальний парк. На другій фазі a і b оцінюють для отримання розчину. AD Model Builder автоматично обчислює стандартні відхилення для будь-якої функції параметрів моделі за допомогою методу delta, щоб заохочувати стабільну репараметризацію моделі.


2

Алгоритм Левенберга-Маркарда може допомогти:

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 (потомство) і використовуйте їх для визначення пошуку в наступній популяції. Повторюйте до зближення. Немає потреби в градієнтах або гессіанах, лише оцінки SSE. Якщо ви не надто жадібні, це дуже часто працює. Проблеми, які часто виникають у людей, полягають у тому, що вони використовують локальний пошук (Ньютон-Рафсон) для виконання роботи глобального пошуку. Як завжди, це питання використання правильного інструменту для роботи. Більше сенсу використовувати глобальний пошук EA, щоб знайти початкові значення для локального пошуку Ньютона, а потім дозволити цьому звести до мінімуму. Але, як і у всіх речах, чорт у деталях.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.