Estou tentando ajustar uma linha + curva exponencial para alguns dados. Para começar, tentei fazer isso em alguns dados artificiais. A função é:
É 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
optim
para 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!
r
nonlinear-regression
nls
steiny
fonte
fonte
Respostas:
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:
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,br−m,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
Então
e conseguimos isso para todosx
Daí a matriz
não será de classificação completa e é por isso
nls
que 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 :)
fonte
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:
Portanto, nenhum ruído == não é bom para os nls de R.
fonte