У меня есть некоторые основные данные о сокращении выбросов и стоимости автомобиля:
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
имеют немного больше смысла), но я не уверен, учитывая Данные, которые у меня есть, как я бы пошел об оценке лучших параметров.
exp(50)
иexp(95)
с y-значениями при x = 50 и x = 95. Если вы установилиc=0
и взяли журнал у (построение линейной зависимости), вы можете использовать регрессию, чтобы получить начальные оценки для журналов ( ) и b, которые будут достаточны для ваших данных (или, если вы укажете линию через начало координат, вы можете оставить a на 1 и просто используйте оценку для b ; этого также достаточно для ваших данных). Если b находится за пределами довольно узкого интервала вокруг этих двух значений, вы столкнетесь с некоторыми проблемами. [В качестве альтернативы попробуйте другой алгоритм]Ответы:
Автоматический поиск хороших начальных значений для нелинейной модели - это искусство. (Для одноразовых наборов данных сравнительно легко, когда вы можете просто нанести на график данные и сделать хорошие предположения визуально.) Один из подходов состоит в том, чтобы линеаризовать модель и использовать оценки наименьших квадратов.
В этом случае модель имеет вид
для неизвестных параметров . Наличие экспоненты побуждает нас использовать логарифмы - но добавление c затрудняет это. Заметьте, однако, что если является положительным , то с будет меньше наименьшего ожидаемого значения Y --и , следовательно , может быть немного меньше , чем наименьшее наблюдаемым значением Y . (Если a может быть отрицательным, вам также необходимо учитывать значение c , которое немного больше наибольшего наблюдаемого значения Y ).a,b,c c a c Y Y a c Y
Тогда давайте позаботимся о , используя в качестве начальной оценки c 0 что-то вроде половины минимума наблюдений y i . Теперь модель можно переписать без этого сложного аддитивного термина, какc c0 yi
Что мы можем взять журнал:
Это линейное приближение к модели. Оба и b могут быть оценены по методу наименьших квадратов.log(a) b
Вот пересмотренный код:
Его вывод (для данных примера)
Конвергенция выглядит хорошо. Давайте построим это:
Это сработало хорошо!
При автоматизации этого процесса вы можете выполнить быстрый анализ остатков, например сравнить их крайние значения с разбросом данных ( ). Вам также может понадобиться аналогичный код, чтобы справиться с возможностью a < 0 ; Я оставляю это как упражнение.y a<0
Другой метод оценки начальных значений основан на понимании их значения, которое может быть основано на опыте, физической теории и т. Д. В моем ответе описан расширенный пример (умеренно сложного) нелинейного соответствия, начальные значения которого можно определить таким образом. на /stats//a/15769 .
Визуальный анализ диаграммы рассеяния (для определения начальных оценок параметров) описан и проиллюстрирован по адресу /stats//a/32832 .
В некоторых случаях создается последовательность нелинейных подгонок, в которой можно ожидать, что решения будут меняться медленно. В этом случае часто удобно (и быстро) использовать предыдущие решения в качестве начальных оценок для следующих . Я помню, как использовал эту технику (без комментариев) на /stats//a/63169 .
источник
Эта библиотека смогла решить мою проблему с помощью nls
singular gradient
: http://www.r-bloggers.com/a-better-nls/ Пример:источник
nls.lm
теперь вызывается.Итак ... Я думаю, что я неправильно прочитал это как экспоненциальную функцию. Все, что мне было нужно, было
poly()
Или, используя
lattice
:источник