Skip to main content
added 2 characters in body
Source Link
DeltaIV
  • 18.4k
  • 7
  • 78
  • 122

Note that the frequencies are exactly the right ones, but the amplitudes of nonzero components are not (1,2,3,4). The reason is that the fda Fourier basis functions are scaled in a weird way: their maximum value is not 1, as it would be for the usual Fourier basis ${1,\sin{ \omega x},\cos{ \omega x},\dots}$. It's not $\frac{1}{\sqrt \pi}$ either, as it would have been for the orthonormal Fourier basis, ${\frac{1}{\sqrt 2\pi},\frac{\sin{ \omega x}}{\sqrt \pi},\frac{\cos{ \omega x}}{\sqrt \pi},\dots}$${\frac{1}{\sqrt {2\pi}},\frac{\sin{ \omega x}}{\sqrt \pi},\frac{\cos{ \omega x}}{\sqrt \pi},\dots}$.

Note that the frequencies are exactly the right ones, but the amplitudes of nonzero components are not (1,2,3,4). The reason is that the fda Fourier basis functions are scaled in a weird way: their maximum value is not 1, as it would be for the usual Fourier basis ${1,\sin{ \omega x},\cos{ \omega x},\dots}$. It's not $\frac{1}{\sqrt \pi}$ either, as it would have been for the orthonormal Fourier basis, ${\frac{1}{\sqrt 2\pi},\frac{\sin{ \omega x}}{\sqrt \pi},\frac{\cos{ \omega x}}{\sqrt \pi},\dots}$.

Note that the frequencies are exactly the right ones, but the amplitudes of nonzero components are not (1,2,3,4). The reason is that the fda Fourier basis functions are scaled in a weird way: their maximum value is not 1, as it would be for the usual Fourier basis ${1,\sin{ \omega x},\cos{ \omega x},\dots}$. It's not $\frac{1}{\sqrt \pi}$ either, as it would have been for the orthonormal Fourier basis, ${\frac{1}{\sqrt {2\pi}},\frac{\sin{ \omega x}}{\sqrt \pi},\frac{\cos{ \omega x}}{\sqrt \pi},\dots}$.

Source Link
DeltaIV
  • 18.4k
  • 7
  • 78
  • 122

They are strongly related. Your example is not reproducible because you didn't include your data, thus I'll make a new one. First of all, let's create a periodic function:

T <- 10
omega <- 2*pi/T
N <- 21
x <- seq(0, T, len = N)
sum_sines_cosines <- function(x, omega){
    sin(omega*x)+2*cos(2*omega*x)+3*sin(4*omega*x)+4*cos(4*omega*x)
}
Yper <- sum_sines_cosines(x, omega)
Yper[N]-Yper[1] # numerically 0

x2 <- seq(0, T, len = 1000)
Yper2 <- sum_sines_cosines(x2, omega)
plot(x2, Yper2, col = "red", type = "l", xlab = "x", ylab = "Y")
points(x, Yper)

enter image description here

Now, let's create a Fourier basis for regression. Note that, with $N = 2k+1$, it doesn't really make sense to create more than $N-2$ basis functions, i.e., $N-3=2(k-1)$ non-constant sines and cosines, because higher frequency components are aliased on such a grid. For example, a sine of frequency $k\omega$ is indistinguishable from a costant (sine): consider the case of $N=3$, i.e., $k=1$. Anyway, if you want to double check, just change N-2 to N in the snippet below and look at the last two columns: you'll see that they're actually useless (and they create issues for the fit, because the design matrix is now singular).

# Fourier Regression with fda
library(fda)
mybasis <- create.fourier.basis(c(0,T),N-2)
basisMat <- eval.basis(x, mybasis)
FDA_regression <- lm(Yper ~ basisMat-1)
FDA_coef <-coef(FDA_regression)
barplot(FDA_coef)

enter image description here

Note that the frequencies are exactly the right ones, but the amplitudes of nonzero components are not (1,2,3,4). The reason is that the fda Fourier basis functions are scaled in a weird way: their maximum value is not 1, as it would be for the usual Fourier basis ${1,\sin{ \omega x},\cos{ \omega x},\dots}$. It's not $\frac{1}{\sqrt \pi}$ either, as it would have been for the orthonormal Fourier basis, ${\frac{1}{\sqrt 2\pi},\frac{\sin{ \omega x}}{\sqrt \pi},\frac{\cos{ \omega x}}{\sqrt \pi},\dots}$.

# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)

enter image description here

You clearly see that:

  1. the maximum value is less than $\frac{1}{\sqrt \pi}$
  2. the Fourier basis (truncated to the first $N-2$ terms) contains a constant function (the black line), sines of increasing frequency (the curves which are equal to 0 at the domain boundaries) and cosines of increasing frequency (the curves which are equal to 1 at the domain boundaries), as it should be

Simply scaling the Fourier basis given by fda, so that the usual Fourier basis is obtained, leads to regression coefficients having the expected values:

basisMat <- basisMat/max(abs(basisMat))
FDA_regression <- lm(Yper ~ basisMat-1)
FDA_coef <-coef(FDA_regression)
barplot(FDA_coef, names.arg = colnames(basisMat), main = "rescaled FDA coefficients")

enter image description here

Let's try fft now: note that since Yper is a periodic sequence, the last point doesn't really add any information (the DFT of a sequence is always periodic). Thus we can discard the last point when computing the FFT. Also, the FFT is just a fast numerical algorithm to compute the DFT, and the DFT of a sequence of real or complex numbers is complex. Thus, we really want the moduluses of the FFT coefficients:

# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)

We multiply by $\frac{2}{N-1}$ in order to have the same scaling as with the Fourier basis ${1,\sin{ \omega x},\cos{ \omega x},\dots}$. If we didn't scale, we would still recover the correct frequencies, but the amplitudes would all be scaled by the same factor with respect to what we found before. Let's now plot the fft coefficients:

fft_coef <- fft_coef[1:((N-1)/2)]
terms <- paste0("exp",seq(0,(N-1)/2-1))
barplot(fft_coef, names.arg = terms, main = "FFT coefficients")

enter image description here

Ok: the frequencies are correct, but note that now the basis functions are not sines and cosines any more (they're complex exponentials $\exp{ni\omega x}$, where with $i$ I denote the imaginary unit). Note also that instead than a set of nonzero frequencies (1,2,3,4) as before, we got a set (1,2,5). The reason is that a term $x_n\exp{ni\omega x}$ in this complex coefficient expansion (thus $x_n$ is complex) corresponds to two real terms $a_n sin(n\omega x)+b_n cos(n\omega x)$ in the trigonometric basis expansion, because of the Euler formula $\exp{ix}=\cos{x}+i\sin{x}$. The modulus of the complex coefficient is equal to the sum in quadrature of the two real coefficients, i.e., $|x_n|=\sqrt{a_n^2+b_n^2}$. As a matter of fact, $5=\sqrt{3^3+4^2}$.