NLS e Lei de Energia Periódica Logarítmica (LPPL) em R

Essa é a coisa mais desafiadora que fiz no R até agora, pois o nls e o LPPL são relativamente novos para mim.

Abaixo está uma parte do script com o qual estou trabalhando. df é um quadro de dados que consiste em duas colunas, Data e Y, que são os preços de fechamento do S&P 500. Não tenho certeza se é relevante, mas as datas começam de 01-01-2003 a 31-12-2007.

f <- function(pars, xx) {pars$a + pars$b*(pars$tc - xx)^pars$m * 
                    (1 + pars$c * cos(pars$omega*log(pars$tc - xx) + pars$phi))} 
# residual function
resids <- function(p, observed, xx) {df$Y - f(p,xx)}
# fit using Levenberg-Marquardt algorithm
nls.out <- nls.lm(par=list(a=1,b=-1,tc=5000, m=0.5, omega=1, phi=1, c=1 ), fn = resids, 
              observed = df$Y, xx = df$days)
# use output of L-M algorithm as starting estimates in nls(...)
par <- nls.out$par

nls.final <- nls(Y~a+b*(tc-days)^m * (1 + c * cos(omega * log(tc-days) + phi)),data=df, 
             start=c(a=par$a, b=par$b, tc=par$tc, m=par$m, omega=par$omega, phi=par$phi,         c=par$c))
summary(nls.final) # display statistics of the fit 
# append fitted values to df
df$pred <- predict(nls.final)

Quando é executado, recebo a seguinte mensagem:

Error in nlsModel(formula, mf, start, wts) : 
  singular gradient matrix at initial parameter estimates
In addition: Warning messages:
1: In log(pars$tc - xx) : NaNs produced
2: In log(pars$tc - xx) : NaNs produced

A fórmula para LPPL pode ser encontrada na 5ª tela deste arquivo pdf,http://www.chronostraders.com/wp-content/uploads/2013/08/Research_on_LPPL.pdf

Você sabe onde eu estou errado? Isso estava funcionando corretamente para um modelo diferente e alterei o código para a nova equação. Agradecemos a jlhoward por esse código desta postagem,Usando nls no R para recriar pesquisas.

Obrigado pela ajuda.

De acordo com o comentário de jlhoward, o df.rda pode ser baixado aqui:https://drive.google.com/file/d/0B4xAKSwsHiEBb2lvQWR6T3NzUjA/edit?usp=sharing

questionAnswers(1)

yourAnswerToTheQuestion