Erro de gradiente singular em nls com valores iniciais corretos

19

Estou tentando ajustar uma linha + curva exponencial para alguns dados. Para começar, tentei fazer isso em alguns dados artificiais. A função é:

y=a+br(xm)+cx
É efetivamente uma curva exponencial com uma seção linear, bem como um parâmetro de deslocamento horizontal adicional ( m ). No entanto, quando uso a nls()função de R, obtenho o temido erro " matriz de gradiente singular nas estimativas de parâmetros iniciais ", mesmo se eu usar os mesmos parâmetros que usei para gerar os dados em primeiro lugar.
Eu tentei os diferentes algoritmos, diferentes valores iniciais e tentei usar optimpara minimizar a soma residual dos quadrados, tudo sem sucesso. Eu li que uma possível razão para isso pode ser uma super parametrização da fórmula, mas não acho que seja (é?)
Alguém tem alguma sugestão para esse problema? Ou isso é apenas um modelo estranho?

Um pequeno exemplo:

#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)

Obrigado!

steiny
fonte
2
Dica: observe o coeficiente de (para um r fixo ) e observe que b r - m = constante possui uma família unidimensional de soluções ( b , m ) com b = r mconstante . rxrbrm=constant(b,m)b=rmconstante
whuber
1
Este não é um modelo identificado, a menos que ou r sejam de alguma forma restritos. Eu acho que exigir r ( 0 , 1 ) faria o trabalho. brr(0,1)
Macro

Respostas:

16

Eu fui mordido por isso recentemente. Minhas intenções eram as mesmas, criar um modelo artificial e testá-lo. O principal motivo é o indicado por @whuber e @marco. Esse modelo não é identificado. Para ver isso, lembre-se de que o NLS minimiza a função:

i=1n(yiabrximcxi)2

Digamos que seja minimizado pelo conjunto de parâmetros (a,b,m,r,c) . Não é difícil ver que o conjunto de parâmetros (a,brm,0,r,c) dará o mesmo valor da função a ser minimizada. Portanto, o modelo não é identificado, ou seja, não há solução única.

Também não é difícil ver por que o gradiente é singular. Denotar

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

Então

fb=rxm

fm=blnrrxm

e conseguimos isso para todos x

blnrfb+fm=0.

Daí a matriz

(f(x1)f(xn))

não será de classificação completa e é por isso nlsque dará a mensagem de gradiente singular.

Passei mais de uma semana procurando bugs no meu código em outro lugar até perceber que o bug principal estava no modelo :)

mpiktas
fonte
2
Eu sei que isso tem muito tempo, mas me pergunto: isso significa que nls não pode ser usado em modelos que não são identificáveis? Por exemplo, uma rede neural?
Conte Zero
grande chance, eu sei, mas você poderia explicar isso para pessoas que se lembram menos de calcário? :). além disso, qual é a solução para o problema do OP? Desistir e ir para casa?
Theforestecologist
2
A solução para o problema do OP é usar um parâmetro em vez de dois, ou seja, em vez de use β r x . O parâmetro m é supérfluo, pois se funde em β , ou seja, β = b r - m . brxmβrxmββ=brm
mpiktas
@ CountZero, basicamente sim, os métodos de otimização comuns falhariam se os parâmetros não fossem identificados. As redes neurais evitam esse problema, adicionando restrições adicionais e usando outros truques interessantes.
mpiktas
Eu acho que ? falta um lnr na resposta? fm=blnr rxm
wiswit 19/02
17

As respostas acima estão, é claro, corretas. Quanto vale, além das explicações fornecidas, se você estiver tentando isso em um conjunto de dados artificial, de acordo com a página de ajuda do nls encontrada em: http://stat.ethz.ch/R-manual/R-patched/ biblioteca / stats / html / nls.html

Os nls de R não serão capazes de lidar com isso. A página de ajuda especifica especificamente:

Atenção

Não use nls em dados artificiais "zero-residual".

A função nls usa um critério de convergência de deslocamento relativo que compara a imprecisão numérica nas estimativas de parâmetros atuais com a soma dos quadrados residuais. Isso funciona bem em dados do formulário

y = f (x, θ) + eps

(com var (eps)> 0). Falha ao indicar convergência nos dados do formulário

y = f (x, θ)

porque o critério equivale a comparar dois componentes do erro de arredondamento. Se você deseja testar nls em dados artificiais, adicione um componente de ruído, conforme mostrado no exemplo abaixo.

Portanto, nenhum ruído == não é bom para os nls de R.

B_D_Dubbya
fonte
Bem-vindo ao site, @B_D_Dubbya. Tomei a liberdade de formatar sua resposta, espero que você não se importe. Você pode encontrar mais informações sobre como editar suas respostas no CV aqui .
gung - Restabelece Monica
1
Estou ciente desse problema - portanto, usando a função "jitter" para adicionar algum ruído
steiny