這是我迄今爲止在R中完成的最具挑戰性的事情,因爲nls和LPPL對我來說都是相當新的。R中的NLS和對數週期冪律(LPPL)
下面是我一直在使用的腳本的一部分。 df是一個由兩列組成的數據框,日期和Y是S & P 500的收盤價。我不確定它是否相關,但是日期從01-01-01開始到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從這篇文章中的代碼,Using nls in R to re-create research。
謝謝你的幫助。
每jlhoward的評論,df.rda可以在這裏下載:https://drive.google.com/file/d/0B4xAKSwsHiEBb2lvQWR6T3NzUjA/edit?usp=sharing
看起來很熟悉......你需要顯示你的數據幀'df',或者你用來下載和處理它的代碼。否則,不可能提供有用的答案。警告可能是因爲xx> pars $ tc。 – jlhoward
已發佈。以前沒有信任你的道歉,已被糾正。 – mks212