Поиск NLS для нескольких серий

Хочу подогнать модель / найти функциональную форму с помощью 70 серии. У меня есть 30 значений для каждого из них. График показывает, что тенденция не является линейной, поэтому я пытаюсь использовать NLS. данные выглядят так

Не уверен, что это правильный подход. Раньше я этого не реализовывал. Должен ли я использовать что-то еще для моделирования? Я получаю следующую ошибку:

Ошибка в nls (y ~ a * exp (b * x), start = list (a = a_start, b = b_start)):
сингулярный градиент

x имеет значения 1:30, которые повторяются 70 раз. Значения Y варьируются от 0 до 1. Должен ли я использовать 71 вектор (длиной 30) или я должен собрать их все в два столбца. На данный момент я собрал их все в две колонки.

Данные выглядят примерно так:


a_start<-0.2
b_start<-2*log(2)/a_start

person NKaz    schedule 03.05.2017    source источник
comment
Я относительно неопытен с nls, но с тех пор, как я его использовал, одна из самых сложных задач - передать ему начальные значения, которые достаточно близки, чтобы он мог найти решение. Я не уверен, связана ли эта ошибка, но это будет проблемой при попытке автоматизировать подгонку многих серий. Для этого вы можете изучить самозапускающиеся модели. См. ?selfStart и ссылки.   -  person lmo    schedule 03.05.2017
comment
Попробуйте взять журнал с обеих сторон и подогнать его с помощью lm, а затем преобразовать результат в начальные значения, или, может быть, lm само по себе достаточно для вас.   -  person G. Grothendieck    schedule 03.05.2017


Ответы (1)


Проблема в том, что ваша формула не является формой, которая точно отражает ваши данные. y ~ a * exp (b * x) никогда не будет выглядеть как ваши данные, поэтому вы получите резкие градиенты, которые не имеют никакого смысла.

Попробуй это:

#some made up data, since none provided
x <- runif(1000) * 30
y <- -0.9 * exp(-0.5 * x) + 1.1 + rnorm(length(x), sd=0.1)

fit <- nls(y ~ a * exp(b * x) + c, start = list(a = -1, b=-.1, c=1))

plot(x,y)
lines(x[order(x)], predict(fit)[order(x)], col="red", lwd=4)

введите описание изображения здесь

person thc    schedule 03.05.2017
comment
Спасибо @thc. Я понимаю, что ошибка возникла из-за неправильной функции. Используя указанную вами функцию, я подхожу. Я хочу, чтобы начало было близко к 0,2. Наверное, мне нужно поиграться с параметрами, чтобы добиться желаемых результатов. - person NKaz; 04.05.2017
comment
@NKaz, рад, что помог. Предложенная мной функция была просто примером, основанным на форме ваших данных. Я предлагаю попытаться найти уравнение, которое имеет смысл с научной точки зрения. Все параметры в модели должны иметь научный смысл. - person thc; 04.05.2017
comment
не могли бы вы предложить какое-либо чтение / ссылку на научный поиск нелинейных уравнений с использованием данных. Я попытался использовать журнал значений y и применить lm. Но остатки автокоррелированы. Другие вещи, которые я пробовал, - это nls2 (грубая сила). Но речь идет о поиске лучших значений параметров - на основе указанной мной формулы. - person NKaz; 05.05.2017
comment
Я хочу определить уравнение, основанное на том, что сгенерировало ваши данные, а не на самих данных. Если бы вы еще не видели данных, какую модель вы бы сочли подходящей? Я не могу дать вам никаких предложений, не зная, о чем ваш проект. - person thc; 05.05.2017
comment
Его данные о продажах из Google Analytics. Ценность конверсии изменяется (в основном увеличивается) в течение 30 дней. У меня есть исторический набор данных о зарегистрированных значениях конверсии с 1 по 30 день, и я хочу разработать модель, чтобы предсказать (с некоторым CI), какой будет рост через 30 дней. Я пытаюсь смоделировать дневную разницу, а не фактическую стоимость продаж. Как я показал на графике, большая часть изменений происходит в течение дня 1-10. Поскольку разные рынки ведут себя по-разному, я пытаюсь разработать модель для каждого рынка отдельно. - person NKaz; 08.05.2017