Сингулярная ошибка градиента в NLS с правильными начальными значениями


19

Я пытаюсь подогнать линию + экспоненциальную кривую к некоторым данным. Для начала я попытался сделать это на некоторых искусственных данных. Функция: Это фактически экспоненциальная кривая с линейным сечением, а также дополнительный параметр горизонтального сдвига ( m ). Однако, когда я использую функцию R, я получаю страшную ошибку « матрица сингулярного градиента при начальных оценках параметров », даже если я использую те же параметры, которые я использовал для генерации данных в первую очередь. Я пробовал разные алгоритмы, разные начальные значения и пытался использовать

y=a+br(xm)+cx
nls()
optimминимизировать остаточную сумму квадратов, все безрезультатно. Я читал, что возможной причиной этого может быть чрезмерная параметризация формулы, но я не думаю, что это так (есть?)
У кого-нибудь есть предложения по этой проблеме? Или это просто неловкая модель?

Краткий пример:

#parameters used to generate the data
reala=-3
realb=5
realc=0.5
realr=0.7
realm=1
x=1:11 #x values - I have 11 timepoint data
#linear+exponential function
y=reala + realb*realr^(x-realm) + realc*x
#add a bit of noise to avoid zero-residual data
jitter_y = jitter(y,amount=0.2)
testdat=data.frame(x,jitter_y)

#try the regression with similar starting values to the the real parameters
linexp=nls(jitter_y~a+b*r^(x-m)+c*x, data=testdat, start=list(a=-3, b=5, c=0.5, r=0.7, m=1), trace=T)

Благодарность!


2
Подсказка: посмотрите на коэффициент (для фиксированного r ) и обратите внимание, что константа b r - m = имеет одномерное семейство решений ( b , m ) с константой b = r m . rxrbrm=constant(b,m)b=rmconstant
whuber

1
Это не идентифицированная модель, если или r не ограничены каким- либо образом. Я думаю, что требование r ( 0 , 1 ) сделало бы эту работу. brr(0,1)
Макро

Ответы:


16

Я недавно укусила это. Мои намерения были такими же, сделать какую-то искусственную модель и проверить ее. Основная причина - та, которую дали @whuber и @marco. Такая модель не опознана. Чтобы увидеть это, помните, что NLS минимизирует функцию:

i=1n(yiabrximcxi)2

(a,b,m,r,c)(a,brm,0,r,c)

Также нетрудно понять, почему градиент является единственным. Обозначим

f(a,b,r,m,c,x)=a+brxm+cx

потом

fb=rxm

fm=blnrrxm

x

blnrfb+fm=0.

Отсюда и матрица

(f(x1)f(xn))

не будет иметь полный ранг, и именно поэтому nlsдаст единственное сообщение градиента.

Я потратил больше недели на поиск ошибок в моем коде в другом месте, пока не заметил, что основная ошибка была в модели :)


2
Это возраст, я знаю, но просто удивляюсь, означает ли это, что nls нельзя использовать на моделях, которые не могут быть идентифицированы? Например, нейронная сеть?
Граф Ноль

большой шанс, я знаю, но вы могли бы разбить это для меньшего количества людей, помнящих кальций? :). Кроме того, каково решение проблемы ОП, тогда? Сдаться и пойти домой?
февраля 1837 г.

2
Решение проблемы OP состоит в том, чтобы использовать один параметр вместо двух, т. Е. Вместо использоватьbrxmβrxmββ=brm

@CountZero, в основном да, обычные методы оптимизации потерпят неудачу, если параметры не определены. Однако нейронные сети обходят эту проблему, добавляя дополнительные ограничения и используя другие интересные приемы.
mpiktas

fm=blnr rxm

17

Ответы выше, конечно, правильные. Для чего стоит, в дополнение к приведенным объяснениям, если вы пытаетесь сделать это на искусственном наборе данных, согласно странице справки nls, найденной по адресу: http://stat.ethz.ch/R-manual/R-patched/ библиотека / статистика / html / nls.html

R's NLS не сможет справиться с этим. На странице справки конкретно указано:

Предупреждение

Не используйте nls на искусственных данных с нулевым остатком.

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

y = f (x, θ) + eps

(с var (eps)> 0). Не указывает на сходимость данных формы

y = f (x, θ)

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

Таким образом, нет шума == не хорошо для R NLS.


Добро пожаловать на сайт @B_D_Dubbya. Я позволил себе отформатировать ваш ответ, надеюсь, вы не против. Вы можете найти больше информации о редактировании ваших ответов на резюме здесь .
gung - Восстановить Монику

1
Я знаю об этой проблеме - следовательно, с помощью функции «джиттер» для добавления шума
steiny
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.