Получение правильных начальных значений для модели NLS в R


12

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

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 - Восстановить Монику

Ответы:


13

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

log(a)b

ab

 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

Это очень полезно, большое спасибо! У меня есть вопрос о том, как вы получили здесь свое «а» значение. Я попытался запустить lm (log10 (rev) ~ log10 (недели)), а затем использовать функцию «итоги», и хотя я получаю то же значение «b», мое значение «a» выходит на 4.3201. Что вы сделали по-другому, чтобы получить = 9,947?
NeonBlueHair

exploge

Ах, ты совершенно прав. Любительская ошибка с моей стороны. Продолжал думать о математических обозначениях, ожидая, что «log» будет означать log base 10 и «ln» для натурального log. Спасибо за разъяснения.
NeonBlueHair

1
Для многих математиков (и многих статистиков) неукрашенный «лог» - это натуральный логарифм, так же как неукрашенный аргумент функции греха в радианах. [Соглашения о конфликтах могут привести к путанице, к сожалению, но когда я, например, начал использовать R, я не задумывался дважды об использовании функции log, поскольку R и я придерживаемся того же соглашения.]
Glen_b -Reinstate Monica

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 ^ b). Этого, вероятно, было бы достаточно, чтобы заставить NLS сходиться. Конечно, как указывает Глен, вы можете использовать соответствующую логарифмическую модель. Это основано на том факте, что существует простое преобразование, которое линеаризует модель. Это часто не тот случай. Проблема с такими подпрограммами R, как nls, заключается в том, что они не предлагают поддержку для повторной параметризации модели. В этом случае репараметризация проста, просто измените масштаб / недавний x и y. Однако после подгонки модели у пользователя будут параметры a и b, отличные от исходных. Хотя по ним легко рассчитать исходные значения, другая трудность заключается в том, что в общем случае не так просто получить расчетные стандартные отклонения для этих оценок параметров. Это делается дельта-методом, который включает в себя гессиан логарифмического правдоподобия и некоторые производные. Программное обеспечение для нелинейной оценки параметров должно автоматически предоставлять эти расчеты, чтобы можно было легко поддерживать повторную параметризацию модели. Еще одна вещь, которую программное обеспечение должно поддерживать, это понятие фаз. Вы можете подумать о том, чтобы сначала согласовать модель с версией Глена как фазу 1. «Реальная» модель подходит на стадии 2. другая трудность заключается в том, что в общем случае не так просто получить расчетные стандартные отклонения для этих оценок параметров. Это делается дельта-методом, который включает в себя гессиан логарифмического правдоподобия и некоторые производные. Программное обеспечение для нелинейной оценки параметров должно автоматически предоставлять эти расчеты, чтобы можно было легко поддерживать повторную параметризацию модели. Еще одна вещь, которую программное обеспечение должно поддерживать, это понятие фаз. Вы можете подумать о том, чтобы сначала согласовать модель с версией Глена как фазу 1. «Реальная» модель подходит на стадии 2. другая трудность заключается в том, что в общем случае не так просто получить расчетные стандартные отклонения для этих оценок параметров. Это делается дельта-методом, который включает в себя гессиан логарифмического правдоподобия и некоторые производные. Программное обеспечение для нелинейной оценки параметров должно автоматически предоставлять эти расчеты, чтобы можно было легко поддерживать повторную параметризацию модели. Еще одна вещь, которую программное обеспечение должно поддерживать, это понятие фаз. Вы можете подумать о том, чтобы сначала согласовать модель с версией Глена как фазу 1. «Реальная» модель подходит на стадии 2. Программное обеспечение для нелинейной оценки параметров должно автоматически предоставлять эти расчеты, чтобы можно было легко поддерживать повторную параметризацию модели. Еще одна вещь, которую программное обеспечение должно поддерживать, это понятие фаз. Вы можете подумать о том, чтобы сначала согласовать модель с версией Глена как фазу 1. «Реальная» модель подходит на стадии 2. Программное обеспечение для нелинейной оценки параметров должно автоматически предоставлять эти расчеты, чтобы можно было легко поддерживать повторную параметризацию модели. Еще одна вещь, которую программное обеспечение должно поддерживать, это понятие фаз. Вы можете подумать о том, чтобы сначала согласовать модель с версией Глена как фазу 1. «Реальная» модель подходит на стадии 2.

Я подгоняю вашу модель к AD Model Builder, который поддерживает фазы естественным образом. На первом этапе оценивалась только оценка. Это получает вашу модель в стадион. На втором этапе А и В оцениваются, чтобы получить решение. AD Model Builder автоматически вычисляет стандартные отклонения для любой функции параметров модели с помощью дельта-метода, чтобы обеспечить стабильную повторную параметризацию модели.


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.