<- datasets::sunspot.month
sunspot plot(sunspot)
3 Regular time series
If a time series is “regular”, that is it has equal time steps between observations, and no missing observations, then its power spectrum can be estimated from its Fourier transform.
3.1 The Fourier Transform
library(PaleoSpec)
<- SpecMTM(sunspot)
sp_sun LPlot(sp_sun)
3.2 The Multitaper Method
3.3 To detrend or not
3.3.1 Why detrend?
library(dplyr)
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
library(tidyr)
library(PaleoSpec)
library(ggplot2)
<- 1/10
f1 <- 1/100
f2 <- 1/1000
f3
<- 1e04
tau
#tau / (1/c(f1, f2, f3))
<- tibble(
dat time = seq(0, tau, by = 1),
y = cos(2*pi*f1*time) + cos(2*pi*f2*time) + cos(2*pi*f3*time)
%>%
) mutate(y = y + rnorm(n(), 0, 0.1))
plot(dat$time, dat$y, type = "l")
<- SpecMTM(ts(dat$y, deltat = 1), detrend = FALSE)
sp1 <- SpecMTM(ts(dat$y, deltat = 1), detrend = TRUE)
sp1_detr
#sp1 <- SpecACF(ts(dat$y, deltat = 1), bin.width = 1, detrend = FALSE)
gg_spec(list(sp1, detrended = sp1_detr)) +
geom_vline(xintercept = c(f1, f2, f3), lty = 2, colour = "Red")
<- SpecACF(ts(dat$y, deltat = 1), bin.width = 1, detrend = FALSE)
sp1_10k <- SpecACF(ts(dat$y, deltat = 1), bin.width = 1, detrend = TRUE)
sp1_10k_detr
plot(y~time, data = dat[1:500,], type = "l")
.5k <- SpecACF(ts(dat$y[1:500], deltat = 1), bin.width = 1, detrend = FALSE)
sp1_0.5k_detr <- SpecACF(ts(dat$y[1:500], deltat = 1), bin.width = 1, detrend = TRUE)
sp1_0
.5k_detr_MTM <- SpecMTM(ts(dat$y[1:500], deltat = 1), detrend = TRUE)
sp1_0
list(
raw_10k = (sp1_10k),
detrended_10k = (sp1_10k_detr),
raw_0.5k = (sp1_0.5k),
detrended_0.5k = (sp1_0.5k_detr)
#detrended_0.5k_MTM = (sp1_0.5k_detr_MTM)
%>%
) lapply(., Spec2DF) %>%
bind_rows(., .id = "name") %>%
separate(name, into = c("detrended", "length"), sep = "_") %>%
mutate(spec_id = detrended) %>%
as_spec_df() %>%
gg_spec(., colour = detrended) +
facet_wrap(~length)#+
#geom_vline(xintercept = c(f1, f2, f3), lty = 2, colour = "blue")
- Even with detrend = FALSE, SpecMTM does some detrending - must be part of the tapering?
library(dplyr)
library(tidyr)
library(PaleoSpec)
library(ggplot2)
<- 1e03
N <- 1000
n_rep = 0.1
alpha = 0
beta
<- crossing(
dat rep = 1:n_rep,
t = 1:N
#%>%
) # group_by(rep) %>%
# mutate(
# y = PaleoSpec::SimPLS(N = N, beta = beta, alpha = alpha)
# )
# Get a matrix of simulated timeseries
<- replicate(n_rep, PaleoSpec::SimPLS(N = N, beta = beta, alpha = alpha))
ts_m
<- SpecACF(ts_m, bin.width = 1, detrend = FALSE)
mean_spec <- SpecACF(ts_m, bin.width = 1)
mean_spec_detrended
$y <- as.numeric(ts_m)
dat
<- dat %>%
specs_mtm_detrend group_by(rep) %>%
do({
Spec2DF(SpecMTM(ts(.$y),
detrend = TRUE
)
)
})
<- dat %>%
specs_mtm_raw group_by(rep) %>%
do({
Spec2DF(SpecMTM(ts(.$y),
detrend = FALSE
)
)
})
<- specs_mtm_raw %>%
mean_spec_MTM_raw group_by(freq) %>%
summarise_if(is.numeric, mean)
<- specs_mtm_detrend %>%
mean_spec_MTM_detrended group_by(freq) %>%
summarise_if(is.numeric, mean)
gg_spec(list("Periodogram_raw_ts" = mean_spec,
"Periodogram_detrended_ts" = mean_spec_detrended,
MTM_detrended = mean_spec_MTM_detrended,
MTM_raw_ts = mean_spec_MTM_raw)) #+
#geom_point(aes(x = freq, y = spec, colour = spec_id))
3.4 Errors
- Explain Gamma / Chi-Sq nature of the errors
- Degrees of freedom / shape of Gamma
- Effect of tapering and smoothing on error distribution
- Confidence intervals