这是迄今为止我在 R 中所做的最具挑战性的事情,因为 nls 和 LPPL 对我来说都是相当新的。
下面是我一直在使用的脚本的一部分。df 是一个数据框,由两列组成,日期和 Y,它们是标准普尔 500 指数的收盘价。我不确定它是否相关,但日期从 01-01-2003 到 12-31-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)
当它运行时,我收到以下消息:
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
LPPL 的公式可以在此 pdf 文件的第 5 屏幕上找到,http://www.chronostraders.com/wp-content/uploads/2013/08/Research_on_LPPL.pdf
你知道我哪里错了吗?这适用于不同的模型,我更改了新方程的代码。这篇文章中的这段代码归功于 jlhoward,在 R 中使用 nls 重新创建研究。
谢谢您的帮助。
根据 jlhoward 的评论,可以在此处下载 df.rda:https ://drive.google.com/file/d/0B4xAKSwsHiEBb2lvQWR6T3NzUjA/edit?usp=sharing