Я пытаюсь приспособить простую модель степенного закона к набору данных, который выглядит следующим образом:
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))
источник
Ответы:
Это общая проблема с нелинейными моделями наименьших квадратов; если ваши начальные значения очень далеки от оптимума, алгоритм может не сходиться, даже если он будет вести себя вблизи оптимума.
источник
exp
log
Пытаться
Меня попросили немного расширить этот ответ. Эта проблема настолько проста, что я немного удивлен, что 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 автоматически вычисляет стандартные отклонения для любой функции параметров модели с помощью дельта-метода, чтобы обеспечить стабильную повторную параметризацию модели.
источник
Алгоритм Левенберга-Марквардта может помочь:
источник
По моему опыту, хороший способ найти начальные значения для параметров моделей NLR - использовать эволюционный алгоритм. Из первоначальной совокупности (100) случайных оценок (родителей) в пространстве поиска выберите лучшие 20 (потомки) и используйте их, чтобы помочь определить поиск в следующей группе. Повторите до схождения. Нет необходимости в градиентах или гессианах, просто оценки SSE. Если вы не слишком жадный, это очень часто работает. Проблемы, с которыми часто сталкиваются люди, заключаются в том, что они используют локальный поиск (Ньютон-Рафсон) для выполнения работы глобального поиска. Как всегда, это вопрос использования правильного инструмента для работы под рукой. Имеет больше смысла использовать глобальный поиск EA, чтобы найти начальные значения для локального поиска Ньютона, и затем довести его до минимума. Но, как и во всем, дьявол кроется в деталях.
источник