Nothing
# aaft.R
# AAFT (Amplitude Adjusted Fourier Transform), copied from Matlab code
# Jan 2012
# For more details see: D. Kugiumtzis, Surrogate data test for nonlinearity including monotonic transformations, Phys. Rev. E, vol. 62, no. 1, 2000.
# generates surrogate data for a given time series data using the AAFT
## INPUT:
# - data : The original time series (column vector)
# - nsur : The number of surrogate data to be generated
## OUTPUT:
# - surrogates : The AAFT surrogate data (matrix of nsur columns)
#' Amplitude Adjusted Fourier Transform (AAFT)
#'
#' Generates random linear surrogate data of a time series with the same
#' second-order properties.
#'
#' The AAFT uses phase-scrambling to create a surrogate of the time series that
#' has a similar spectrum (and hence similar second-order statistics). The AAFT
#' is useful for testing for non-linearity in a time series, and is used by
#' \code{nonlintest}.
#'
#' @param data a vector of equally spaced numeric observations (time series).
#' @param nsur the number of surrogates to generate (1 or more).
#' @return \item{surrogates}{a matrix of the \code{nsur} surrogates.}
#' @author Adrian Barnett \email{a.barnett@qut.edu.au}
#' @references Kugiumtzis D (2000) Surrogate data test for nonlinearity
#' including monotonic transformations, \emph{Phys. Rev. E}, vol 62
#' @examples
#'
#' \donttest{
#' data(CVD)
#' surr = aaft(CVD$cvd, nsur=1)
#' plot(CVD$cvd, type='l')
#' lines(surr[,1], col='red')
#' }
#'
#' @export aaft
aaft = function(data, nsur){
n = length(data);
# The following gives the rank order, ixV
ixV=order(data);
rxV=rank(data); # ranks
oxV=data[ixV] # smallest to largest
# ===== AAFT algorithm
surrogates=matrix(data=0,n,nsur);
for (count in 1:nsur){
# Rank ordering white noise with respect to data
rV = rnorm(n); # random N(0,1)
orV=rV[order(rV)]; # in order, smallest to largest
yV = orV[rxV]; #
# cor(yV,data,method='spearman') # Not run, should be one
# >>>>> Phase randomisation (Fourier Transform): yV -> yftV
if(n%%2==0){n2 = n/2}else{n2 = (n-1)/2}
tmpV = fft(yV,2*n2); # FFT
magnV = abs(tmpV); # magnitude
fiV = Arg(tmpV); # phases
rfiV = runif(n2-1) * 2 * pi; # random phases
nfiV = c(0, rfiV, fiV[n2+1], -rev(rfiV));
# New Fourier transformed data with only the phase changed
tmpV = c(magnV[1:(n2+1)],rev(magnV[2:n2]));
c.exp=cos(nfiV)+ 1i*sin(nfiV) # complex exponential
tmpV = tmpV * c.exp;
# Transform back to time domain;
yftV=Re(fft(tmpV,inverse=TRUE)); # 3-step AAFT;
# <<<<<
iyftV = rank(yftV); # Rank ordering data with respect to yftV
surrogates[,count] = oxV[iyftV]; # surrogates is the AAFT surrogate of data
} # end of loop
return(surrogates)
} # end of function
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.