I have done a fair bit of spectral analysis, and hadn't finished collecting my
thoughts for a reply, so hadn't replied yet.
What exactly do you mean by normalize?
I have not used the functons periodogram or spectrum, however from the
description for periodogram it appears that it returns the spectral density,
which is already normalized by frequency, so you don't have to worry about
changing the appearance of your periodogram or power spectrum if you change the
time intervals of your data. With a normal Fourier Transform, not only do you
need to complex square the terms but you also need to divide by a normalizing
factor to give power-per-frequency-bin, which the periodogram appears to do.
However, if you look in various textbooks, the definition of the Fourier
Transform (FT) varies from author to author in the magnitude of the prepended
scaling factor. Since the periodogram is related to the FT (periodogram
ultimately uses the function mvfft), without examination of the code for
periodogram you cannot know the scaling factor, which is almost always one of
the following:
1.0
1/2
1/(2*pi)
SQRT(1/2)
SQRT(1/(2*pi))
In fact, if you obtain an FT (or FFT or DFT) from a piece of electronics (say
an electronic spectrum analyzer), the prepending factor can vary from
manufacturer to manufacturer.
Fortunately, there is a strict relationship between the variance of your
signal and the integrated spectral density. If your time signal is x(t), the
spectral density is S(f), and fc = frequency(x)/2 the Nyquist cutoff frequency,
then this may be expressed as:
variance(x(t)) = constant * {Integral from 0 to fc of S(f)}
In R-code: let x be your time series, and "constant" be the unknown scaling
factor (1/2, 1/2pi, etc.)
p <- periodogram(x)
var(x) == constant * sum(p[[1]])/length(p[[1]])
Or:
constant = sum(p[[1]])/length(p[[1]])/var(x)
and we find that the appropriate scaling constant is 1.0.
As regards plotting versus period, the periodogram returns arrays of spectral
amplitude and frequencies. The frequencies are in inverse units of the
intervals of your time series. i.e. if your time series is 1-point per day,
then the frequencies are in 1/day units. Thus if you wish to plot amplitude
versus period in weeks you have a little math to do.
I believe that plotting is usually versus frequency since most observers are
interested in how things vary versus frequency: multiple evenly spaced peaks on
a linear frequency scale indicates the presence of harmonics; this is not so
simply seen in a plot versus period. ex. peaks of 10 Hz, 20 Hz, 30 Hz, 40
Hz,... in period would be at periods of 100 ms, 50 ms, 25 ms, 12.5 ms, and the
peaks are not evenly spaced.
Additionally, there are all kinds of typical responses versus frequency (1/f,
1/f^2) which are clearly seen in plots versus frequency as straight lines (log
power vs log frequency), but would come out as curves in plots versus period.
I can see how ecological studies may indeed be more interested in the periods.
However, I would be wary of using the periodogram function, for if I
calculate periodograms of the same sinewave but for differing lengths of the
sample, the spectral density does not come out the same. All 4 of the plots
produced by the code below should overlay, and yet as the time series becomes
longer there appears to be an increasing offset of the magnitudes returned.
(black-brown-blue-red)
x0<-ts(data=sin(2*pi*1.1*(1:1000)/10),frequency=10)
p0<-periodogram(x0)
var(x0)
x1<-ts(data=sin(2*pi*1.1*(1:10000)/10),frequency=10)
p1<-periodogram(x1)
var(x1)
x2<-ts(data=sin(2*pi*1.1*(1:100000)/10),frequency=10)
p2<-periodogram(x2)
var(x2)
x3<-ts(data=sin(2*pi*1.1*(1:1000000)/10),frequency=10)
p3<-periodogram(x3)
var(x3)
plot(p3[[2]],p3[[1]],col="red",type="p",pch=19,cex=0.05,log="y",
xlim=c(0.1,0.12),ylim=c(1e-30,1e-15))
points(p2[[2]],p2[[1]],type="l",col="blue")
points(p1[[2]],p1[[1]],type="l",col="brown")
points(p0[[2]],p0[[1]],type="o",col="black")
> Message: 113
> Date: Mon, 30 Jan 2006 17:45:58 -0800
> From: Spencer Graves <[EMAIL PROTECTED]>
> Subject: Re: [R] How do I "normalise" a power spectral density
> analysis?
> To: Tom C Cameron <[EMAIL PROTECTED]>
> Cc: [email protected]
> Message-ID: <[EMAIL PROTECTED]>
> Content-Type: text/plain; charset=us-ascii; format=flowed
>
> Since I have not seen a reply to this post, I will
> offer a comment,
> even though I have not used spectral analysis myself and
> therefore have
> you intuition about it. First, from the definitions I read in the
> results from, e.g., RSiteSearch("time series power spectral density")
> [e.g.,
> http://finzi.psych.upenn.edu/R/library/GeneTS/html/periodogram
> .html] and
> "spectral analysis" in Venables and Ripley (2002) Modern Applied
> Statistics with S (Springer), I see no reason why you
> couldn't plot the
> spectrum vs. the period rather than the frequency. Someone else may
> help us understand why it is usually plotted vs. the frequency; I'd
> guess that the standard plot looks more like the integrand in the
> standard Fourier inversion formula, but I'm not sure.
>
> If you'd like more help from this listserve, you
> might briefly
> describe the problem you are trying to solve, why you think spectral
> analysis analysis should help, and include a toy example with some
> self-contained R code to illustrate what you tried and what you don't
> understand about it. (And PLEASE do read the posting guide!
> "www.R-project.org/posting-guide.html". Nothing is certain but
> following that posting guide will, I believe, tend to
> increase the speed
> and utility of response.)
>
> hope this helps.
> spencer graves
>
> Tom C Cameron wrote:
>
> > Hi everyone
> >
> > Can anyone tell me how I normalise a power spectral density
> (PSD) plot of a
> > periodical time-series. At present I get the graphical
> output of spectrum VS
> > frequency.
> >
> > What I want to acheive is period VS spectrum? Are these the
> same things but the
> > x-axis scale needs transformed ?
> >
> > Any help would be greatly appreciated
> >
> > Tom
> >
> ..............................................................
> .............
> > Dr Tom C Cameron office: 0113 34
> 32837 (10.23 Miall)
> > Ecology & Evolution Res. Group. lab: 0113 34 32884
> (10.20 Miall)
> > School of Biological Sciences Mobile: 07966160266
> > University of Leeds email:
> [EMAIL PROTECTED]
> > Leeds LS2 9JT
> > LS2 9JT
> >
> > ______________________________________________
> > [email protected] mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide!
> http://www.R-project.org/posting-guide.html
>
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html