기본 문제는 독립 변수를 지정하지 않았다는 것입니다. a, b, tc, and t
에 start(...)
을 지정하면 nls(...)
에 모델의 모든 매개 변수가 표시됩니다.
a, b, and tc
이 매개 변수이고 t
이 독립 변수 인 LPPL 모델의 단순화 된 버전을 사용하는 것 같습니다. data2$Date
에는 시간 변수가 들어 있습니다. data2$Date
이 POSIXct 클래스인지 확인해야합니다. 그래서 당신은 쓸 수 :
df$Date <- as.POSIXct(df$Date, format="%m/%d/%y")
nls1 <- nls(Y~a+b*log(tc-Date), data=data2, start=list(a=0, b=1, tc=1466))
편집 :를 OP의 의견
이 좋은 질문에 대한 응답으로는 nls(...)
을 사용하여 몇 가지 문제를 설명하기 때문이다. 현재 모델이 올바르게 지정되었으므로 문제는 nls(...)
이 수렴하지 못하는 것입니다. 기본적으로, 시작 매개 변수 추정치가 최종 적합 값에 비교적 가깝지 않으면 (또는 모델이 극도로 "잘 작동"하지 않는 한) nls가 실패합니다. [당신이 인용 한 논문은 b가 b = 1로 시작하는 반면에 b가 <으로 제한된다는 것을 언급합니다.] 그래서 어떻게해야합니까?
minpack
패키지의 minpack.lm(...)
기능은 비선형 최소 제곱 추정을 위해 매우 강력한 Levenberg-Marquardt 알고리즘을 사용합니다. 사실, 당신이 인용 한 논문은 L-M을 구체적으로 언급합니다. minpack.lm(...)
의 문제점은 사용하기가 훨씬 더 어렵다는 것입니다 (함수를 정의하기보다는 주어진 단계에서 나머지를 반환하는 함수를 정의해야합니다). 또한 minpack.lm(...)
은 적합성 통계를 계산하지 않습니다.
그래서 해결책은 둘 다 사용하는 것입니다. minpack.lm(...)
을 사용하여 매개 변수를 추정 한 다음 nls(...)
에서 "시작 값"으로 사용하십시오. 아래의 코드는 그렇게합니다. nls(...)
을 사용하여 모형을 적합하게하면 적합성, 예측 된 값, 잔차의 통계를 생성하고 새 데이터 세트에 모델을 적용하는 것이 훨씬 쉬워집니다.하나는 최소 제곱 회귀 분석을 수행 할 때
# this section just grabs the DJIA for 1982 - 1987; you already have this
library(tseries)
library(zoo)
ts <- get.hist.quote(instrument="DJIA",
start="1982-01-01", end="1987-08-01",
quote="Close", provider="yahoo", origin="1970-01-01",
compression="d", retclass="zoo")
df <- data.frame(ts)
df <- data.frame(Date=as.Date(rownames(df)),Y=df$Close)
df <- df[!is.na(df$Y),]
# end of setup...
library(minpack.lm) # for nls.lm(...)
library(ggplot2) # for ggplot
df$days <- as.numeric(df$Date - df[1,]$Date)
# model based on a list of parameters
f <- function(pars, xx) {pars$a + pars$b*log(pars$tc - xx)}
# 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), 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*log(tc-days),data=df,
start=c(a=par$a, b=par$b, tc=par$tc))
summary(nls.final) # display statistics of the fit
# append fitted values to df
df$pred <- predict(nls.final)
# plot the results
ggplot(df)+
geom_line(aes(x=Date,y=Y),color="black")+
geom_line(aes(x=Date,y=pred),color="blue",linetype=2)+
labs(title="LPPL Model Applied to DJIA (1982 - 1987)",
x="", y="DJIA (daily close)")+
theme(plot.title=element_text(face="bold"))
우수 제안, 감사합니다. 그것은 나를 따라 움직였다. nls1 행을 실행하면'-.POSIXt' (tc, Date)에 다음 오류가 발생합니다 : "POSIXt"객체에서만 감할 수 있습니다. 나는 이것이 tc가 정수가 아니라 날짜라는 사실과 관련이 있다고 상상한다. – mks212
방법론 및이 특정 방정식이 선택된 이유는 여기에 나와있는 학술지에서 이론적 근거를 설명합니다. http://www.chronostraders.com/wp-content/uploads/2013/08/LP-clusters .pdf – mks212
@ user2926358 - 위의 수정 사항을 참조하십시오. 왜 아직도 오류가 발생하고 있습니까? – jlhoward