これは、nls と LPPL の両方が私にとってかなり新しいものであるという点で、これまで R で行った中で最も困難なことです。
以下は、私が取り組んできたスクリプトの一部です。df は、S&P 500 の終値である日付と Y の 2 つの列で構成されるデータ フレームです。関連性があるかどうかはわかりませんが、日付は 2003 年 1 月 1 日から 2007 年 12 月 31 日までです。
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 番目の画面にあります。
私がどこで間違っているか知っていますか?これは別のモデルでは正しく機能していたので、新しい方程式のコードを変更しました。この投稿のこのコードについては、jlhoward の功績によるもので、R で nls を使用して研究を再作成します。
ご協力ありがとうございました。
jlhoward のコメントによると、df.rda はここからダウンロードできます: https://drive.google.com/file/d/0B4xAKSwsHiEBb2lvQWR6T3NzUjA/edit?usp=sharing