Learn R Programming

stats (version 3.3)

spec.pgram: Estimate Spectral Density of a Time Series by a Smoothed Periodogram

Description

spec.pgram calculates the periodogram using a fast Fourier transform, and optionally smooths the result with a series of modified Daniell smoothers (moving averages giving half weight to the end values).

Usage

spec.pgram(x, spans = NULL, kernel, taper = 0.1,
           pad = 0, fast = TRUE, demean = FALSE, detrend = TRUE,
           plot = TRUE, na.action = na.fail, ...)

Arguments

x
univariate or multivariate time series.
spans
vector of odd integers giving the widths of modified Daniell smoothers to be used to smooth the periodogram.
kernel
alternatively, a kernel smoother of class "tskernel".
taper
specifies the proportion of data to taper. A split cosine bell taper is applied to this proportion of the data at the beginning and end of the series.
pad
proportion of data to pad. Zeros are added to the end of the series to increase its length by the proportion pad.
fast
logical; if TRUE, pad the series to a highly composite length.
demean
logical. If TRUE, subtract the mean of the series.
detrend
logical. If TRUE, remove a linear trend from the series. This will also remove the mean.
plot
plot the periodogram?
na.action
NA action function.
...
graphical arguments passed to plot.spec.

Value

  • A list object of class "spec" (see spectrum) with the following additional components:
  • kernelThe kernel argument, or the kernel constructed from spans.
  • dfThe distribution of the spectral density estimate can be approximated by a (scaled) chi square distribution with df degrees of freedom.
  • bandwidthThe equivalent bandwidth of the kernel smoother as defined by Bloomfield (1976, page 201).
  • taperThe value of the taper argument.
  • padThe value of the pad argument.
  • detrendThe value of the detrend argument.
  • demeanThe value of the demean argument.
  • The result is returned invisibly if plot is true.

Details

The raw periodogram is not a consistent estimator of the spectral density, but adjacent values are asymptotically independent. Hence a consistent estimator can be derived by smoothing the raw periodogram, assuming that the spectral density is smooth.

The series will be automatically padded with zeros until the series length is a highly composite number in order to help the Fast Fourier Transform. This is controlled by the fast and not the pad argument.

The periodogram at zero is in theory zero as the mean of the series is removed (but this may be affected by tapering): it is replaced by an interpolation of adjacent values during smoothing, and no value is returned for that frequency.

References

Bloomfield, P. (1976) Fourier Analysis of Time Series: An Introduction. Wiley.

Brockwell, P.J. and Davis, R.A. (1991) Time Series: Theory and Methods. Second edition. Springer.

Venables, W.N. and Ripley, B.D. (2002) Modern Applied Statistics with S. Fourth edition. Springer. (Especially pp.392--7.)

See Also

spectrum, spec.taper, plot.spec, fft

Examples

Run this code
require(graphics)

## Examples from Venables & Ripley
spectrum(ldeaths)
spectrum(ldeaths, spans = c(3,5))
spectrum(ldeaths, spans = c(5,7))
spectrum(mdeaths, spans = c(3,3))
spectrum(fdeaths, spans = c(3,3))

## bivariate example
mfdeaths.spc <- spec.pgram(ts.union(mdeaths, fdeaths), spans = c(3,3))
# plots marginal spectra: now plot coherency and phase
plot(mfdeaths.spc, plot.type = "coherency")
plot(mfdeaths.spc, plot.type = "phase")

## now impose a lack of alignment
mfdeaths.spc <- spec.pgram(ts.intersect(mdeaths, lag(fdeaths, 4)),
   spans = c(3,3), plot = FALSE)
plot(mfdeaths.spc, plot.type = "coherency")
plot(mfdeaths.spc, plot.type = "phase")

stocks.spc <- spectrum(EuStockMarkets, kernel("daniell", c(30,50)),
                       plot = FALSE)
plot(stocks.spc, plot.type = "marginal") # the default type
plot(stocks.spc, plot.type = "coherency")
plot(stocks.spc, plot.type = "phase")

sales.spc <- spectrum(ts.union(BJsales, BJsales.lead),
                      kernel("modified.daniell", c(5,7)))
plot(sales.spc, plot.type = "coherency")
plot(sales.spc, plot.type = "phase")

Run the code above in your browser using DataLab