⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 whittle.s

📁 计算hurst的程序
💻 S
字号:
#################################################Splus function and programs for the#calculation of Whittle's estimator and#the goodness of fit statistic as defi-#ned in Beran (1992). The models are#fractional gaussian noise or fractional#Arima.#The data series may be divided into#subseries for which the parameters are#fitted separately.##################################################Functions#################################################CetaFGN##Covariance matrix of hat{eta} for fgn###############################################CetaFGN_function(eta)        {        M_length(eta)#size of steps in Riemann sum: 2*pi/m        m_10000        mhalfm_trunc((m-1)/2)#size of delta for numerical calculation of derivative        delta_0.000000001#partial derivatives of log f(at each fourier frequency)        lf_matrix(1,ncol=M,nrow=mhalfm)        f0_fspecFGN(eta,m)$fspec        for(j in (1:M))        {         etaj_eta         etaj[j]_etaj[j]+delta         fj_fspecFGN(etaj,m)$fspec         lf[,j]_log(fj/f0)/delta        }#Calculate D                Djl_matrix(1,ncol=M,nrow=M)        for(j in (1:M))         {for(l in (1:M))          {Djl[j,l]_2*2*pi/m*sum(lf[,j]*lf[,l])          }         }	#Result        drop(matrix(4*pi*solve(Djl),ncol=M,nrow=M,byrow=T))        }################################################CetaARIMA##Covariance matrix of hat{eta}#for fractional ARIMA###############################################CetaARIMA_function(eta,p,q)        {        M_length(eta)#size of steps in Riemann sum: 2*pi/m        m_10000        mhalfm_trunc((m-1)/2)#size of delta for numerical calculation of derivative        delta_0.000000001#partial derivatives of log f (at each fourier frequency        lf_matrix(1,ncol=M,nrow=mhalfm)        f0_fspecARIMA(eta,p,q,m)$fspec        for(j in (1:M))         {         etaj_eta         etaj[j]_etaj[j]+delta         fj_fspecARIMA(etaj,p,q,m)$fspec         lf[,j]_log(fj/f0)/delta         }#Calculate D        Djl_matrix(1,ncol=M,nrow=M)        for(j in (1:M))         {for(l in (1:M))          {Djl[j,l]_2*2*pi/m*sum(lf[,j]*lf[,l])          }         }#Result        drop(matrix(4*pi*solve(Djl),ncol=M,nrow=M,byrow=T))        }################################################Qeta##Function for the calculation of A, B and#Tn=A/B**2#where A = 2pi/n sum 2*[I(lambda_j)/f(lambda_j)],#B = 2pi/n sum 2*[I(lambda_j)/f(lambda_j)]**2 ans#the sum is taken over all fourier frequencies#lambda_j=2pi*j/n (j=1,...,(n-1)/2.#f is the spectral density of fractional gaussian#noise or fractional ARIMA(p,d,q)#with self-similarity parameter H=h.#cov(X(t),X(t+k))=integral(exp(iuk)f(u)du)##NOTE: yper[1] must be the periodogram I(lambda_1) at#the frequency @pi/n (i.e. not the frequency zero!).##INPUT: h##(n,nhalfm=trunc[(n-1)/2] and the#nhalfm-dimensional vector yper must#be defined.)###OUTPUT: list(n=n,h=h,A=A,B=B,Tn=Tn,z=z,pval=pval,#theta1=theta1,fspec=fspec)##Tn is the goodness of fit test statistic#Tn=A/B**2 defined in Beran (1992),#z is the standardized test statistic,#pval the corrsponding p-value P(w>z).#theta1 is the scale parameter such that#f=theta1*fspec and integral(log[fspec])=0################################################Qeta_function(eta)        {#       cat("in function Qeta", fill=T)        h_eta[1]#spectrum at fourier frequencies        if(imodel==1)         {fspec_fspecFGN(eta,n)         theta1_fspec$theta1         fspec_fspec$fspec}        else         {fspec_fspecARIMA(eta,p,q,n)         theta1_fspec$theta1         fspec_fspec$fspec}#Tn=A/B**2        yf_yper/fspec        yfyf_yf**2        A_2*(2*pi/n)*sum(yfyf)        B_2*(2*pi/n)*sum(yf)        Tn_A/(B**2)        z_sqrt(n)*(pi*Tn-1)/sqrt(2)        pval_1-pnorm(z)        theta1_B/(2*pi)        fspec_fspec        Qresult_list(n=n,h=h,                eta=eta,A=A,B=B,Tn=Tn,z=z,pval=pval,                theta1=theta1,fspec=fspec)        drop(Qresult)        }################################################calculation of the spectral density of#normalized fractional gaussian noise#with self-similarity parameter H=h#at the Fourier frequencies 2*pi*j/m (j=1,...,(m-1)).##Remarks:##1. cov(X(t),X(t+k))=integral[exp(iuk)f(u)du]#2. f=theta1*fspec and integral[log(fspec)]=0##INPUT: m=sample size#h=self-similarity parameter##OUTPUT:list(fspec=fspec,theta1=theta1)################################################fspecFGN_function(eta,m)        {#parameters for the calculation of f       #        h_eta[1]#        nsum_200#        hh_-2*h-1#        const_1/pi*sin(pi*h)*gamma(-hh)#        j_2*pi*c(0:nsum)#x=2*pi*(j-1)/m (j=1,2,...,(n-1)/2)#Fourier frequency#        mhalfm_trunc((m-1)/2)#        x_1:mhalfm#        x_2*pi/m*x#calculation of f at fourier frequencies#        fspec_matrix(0,mhalfm)#        for(i in seq(1:mhalfm))#         {#         lambda_x[i]#         fi_matrix(lambda,(nsum+1))#         fi_abs(j+fi)**hh+abs(j-fi)**hh#         fi[1]_fi[1]/2#         fi_(1-cos(lambda))*const*fi#         fspec[i]_sum(fi)#         }	fspec <- ffourier.FGN.est(eta, m)#Above change made to speed up routine.  Due to Vern Paxson.   3/23/95 VT###############################################        logfspec_log(fspec)        fint_2/(m)*sum(logfspec)        theta1_exp(fint)        fspec_fspec/theta1        drop(list(fspec=fspec,theta1=theta1))        }ffourier.FGN.est <-function(H, n)FGN.spectrum((2 * pi * (1:((n - 1)/2)))/n, H)/pi/2FGN.spectrum <-function(lambda, H){        2 * sin(pi * H) * gamma(2 * H + 1) * (1 - cos(lambda)) * (lambda^(-2 *                 H - 1) + FGN.B.est.adjust(lambda, H))}FGN.B.est.adjust <- function(lambda, H){        B <- FGN.B.est(lambda, H)        (1.0002 - 0.000134 * lambda) * (B - 2^(-7.65 * H - 7.4))}FGN.B.est <- function(lambda, H){        d <-  - (2 * H + 1)        dprime <- -2 * H        a <- function(lambda, k)        2 * k * pi + lambda        b <- function(lambda, k)        2 * k * pi - lambda        a1 <- a(lambda, 1)        b1 <- b(lambda, 1)        a2 <- a(lambda, 2)        b2 <- b(lambda, 2)        a3 <- a(lambda, 3)        b3 <- b(lambda, 3)        a4 <- a(lambda, 4)        b4 <- b(lambda, 4)        a1^d + b1^d + a2^d + b2^d + a3^d + b3^d + (a3^dprime + b3^dprime + a4^                dprime + b4^dprime)/(8 * pi * H)}################################################calculation of the spectral density of#fractional ARMA with standard normal innovations#and self similarity parameter H=h#at the fourier frequencies 2*pi*j/n (j=1,...,(n-1)).#cov(X(t),X(t+k))=(sigma/(2*pi))*integral(exp(iuk)g(u)du).##INPUT: m=sample size#h=theta[1]=self-similarity parameter#phi=theta[2:(p+1)]=AR(p)-parameters#psi=theta[(p+2):(p+q+1)]=MA(q)-parameters##OUTPUT:list(fspec=fspec,theta1=theta1)################################################fspecARIMA_function(eta,p,q,m)        {################################################       cat("in fspecARIMA",fill=T)        h_eta[1]        phi_c()        psi_c()#x=2*pi*(j-1)/m (j=1,2,...,(n-1)/2)#=Fourier frequencies        mhalfm_trunc((m-1)/2)        x_1:mhalfm        x_2*pi/m*x#calculation of f at fourier frequencies        far_(1:mhalfm)/(1:mhalfm)        fma_(1:mhalfm)/(1:mhalfm)        if(p>0)         {phi_cbind(eta[2:(p+1)])         cosar_cos(cbind(x)%*%rbind(1:p))         sinar_sin(cbind(x)%*%rbind(1:p))         Rar_cosar%*%phi         Iar_sinar%*%phi         far_(1-Rar)**2+Iar**2         }#       cat("far calculated",fill=T)        if(q>0)         {psi_cbind(eta[(p+2):(p+q+1)])         cosar_cos(cbind(x)%*%rbind(1:q))         sinar_sin(cbind(x)%*%rbind(1:q))         Rar_cosar%*%psi         Iar_sinar%*%psi         fma_(1+Rar)**2+Iar**2         }#       cat("fma calculated", fill=T)        fspec_fma/far*sqrt((1-cos(x))**2+sin(x)**2)**(1-2*h)        theta1_1/(2*pi)#       cat("end of fspecARIMA",fill=T)        drop(list(fspec=fspec,theta1=theta1))        }################################################definition of the periodogram###############################################per_function(z)        {n_length(z)        (Mod(fft(z))**2/(2*pi*n)) [1:(n%/%2+1)]        }################################################definition of function to be minimized###############################################Qmin_function(etatry)        {        result_Qeta(etatry)$B	if(out==T)	{        cat("etatry=",etatry,"B=",result,sep=" ",fill=T)}	assign("bBb",result,frame=0)        drop(result)        }################################################           M A I N    P R O G R A M###############################################whittle_function(xinput, nsub = 1, model = "farima", pp = 1, qq = 1, h =0.5, ar = c(0.5), ma = c(0.5), out = T, spec = F){	assign("out", out, frame = 1)	nmax <- length(xinput)	startend <- c(1, nmax)	istart <- startend[1]	iend <- startend[2]	nloop <- nsub	assign("n", trunc((iend - istart + 1)/nloop), frame = 1)	nhalfm <- trunc((n - 1)/2)	if(model == "farima")		assign("imodel", 2, frame = 1)	if(model == "fgn")		assign("imodel", 1, frame = 1)	assign("p", 0, frame = 1)	assign("q", 0, frame = 1)	if(imodel == 2) {		assign("p", pp, frame = 1)		assign("q", qq, frame = 1)	}	else {		assign("p", 0, frame = 1)		assign("q", 0, frame = 1)	}	eta <- c(h)	if(p > 0) {		eta[2:(p + 1)] <- ar	}	if(q > 0) {		eta[(p + 2):(p + q + 1)] <- ma	}	M <- length(eta)	#loop	thetavector <- c()	i0 <- istart	flax <- vector("list", nloop)	#necessary to make nsub/nloop work.  VT.	for(iloop in (1:nloop)) {		h <- max(0.2, min(h, 0.9))		eta[1] <- h		i1 <- i0 + n - 1		y <- xinput[i0:i1]	#standardize data		vary <- var(y)		y <- (y - mean(y))/sqrt(var(y))	#periodogram of the data		if(spec == T) {			assign("yper", per(y)[2:(nhalfm + 1)], w = 1)		}		else {			assign("yper", per(y)[2:(nhalfm + 1)], frame = 1)		}		s <- 2 * (1 - h)		etatry <- eta	#	Modified to make nlmin not give incorrect result.  VT		if(imodel == 1) {			result <- nlminb(start = etatry, objective = Qmin, 				lower = 0, upper = 0.999)		}		else {			result <- nlminb(start = etatry, objective = Qmin)		}		eta <- result$parameters		sturno <- result$message		theta1 <- Qeta(eta)$theta1		theta <- c(theta1, eta)		thetavector <- c(thetavector, theta)	#calculate goodness of fit statistic		Qresult <- Qeta(eta)	#output		M <- length(eta)		if(imodel == 1) {			SD <- CetaFGN(eta)			SD <- matrix(SD, ncol = M, nrow = M, byrow = T)/n		}		else {#  Changed to eliminate crashing in solve.qr in CetaARIMA.  VT			cat("M = ", M, "\n")			if(M > 2) {				for(i in 3:M) {				  for(j in 2:(i - 1)) {				    temp <- eta[i] + eta[j]				    if(abs(temp) < 0.0001) {				      cat(	        "Problem with estimating confidence intervals, parameter ",				        i, "and  parameter ", j, 				        "are the same, eliminating.\n")				      eta <- eta[ - i]				      eta <- eta[ - j]				      M <- M - 2				      p <- p - 1				      q <- q - 1				    }				  }				}			}			SD <- CetaARIMA(eta, p, q)			SD <- matrix(SD, ncol = M, nrow = M, byrow = T)/n		}		Hlow <- eta[1] - 1.96 * sqrt(SD[1, 1])		Hup <- eta[1] + 1.96 * sqrt(SD[1, 1])		if(out == T) {			cat("theta=", theta, fill = T)			cat("H=", eta[1], fill = T)			cat("95%-C.I. for H: [", Hlow, ",", Hup, "]", fill = T)		}##Changing of the signs of the moving average parameters#in order to respect the sign of the Splus convention#		if(q > 0) {			eta[(p + 2):(p + q + 1)] <-  - eta[(p + 2):(p + q + 1)]		}		etalow <- c()		etaup <- c()		for(i in (1:length(eta))) {			etalow <- c(etalow, eta[i] - 1.96 * sqrt(SD[i, i]))			etaup <- c(etaup, eta[i] + 1.96 * sqrt(SD[i, i]))		}		if(out == T) {			cat("95%-C.I.:", fill = T)			print(cbind(etalow, etaup), fill = T)		}		if(spec == T) {			cat("periodogram is in yper", fill = T)			assign("fest", Qresult$theta1 * Qresult$fspec, w = 1)			cat("spectral density is in fest", fill = T)		}		flax[[iloop]] <- list()		# To make nsub work.  VT.		flax[[iloop]]$parameter <- eta		flax[[iloop]]$sigma2 <- bBb * var(xinput)		flax[[iloop]]$conv.type <- sturno		remove("bBb", frame = 0)		#next subseries		i0 <- i0 + n	##Changing of the signs of the moving average parameters#		if(q > 0) {			eta[(p + 2):(p + q + 1)] <-  - eta[(p + 2):(p + q + 1)]		}	}	return(flax)##	Clean up#	remove("n", frame = 1)	remove("p", frame = 1)	remove("q", frame = 1)	remove("imodel", frame = 1)	remove("out", frame = 1)	if(spec == F) {		remove("yper", frame = 1)	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -