Están estrechamente relacionados. Tu ejemplo no es reproducible porque no incluiste tus datos, así que haré uno nuevo. En primer lugar, vamos a crear una función periódica:
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)
Ahora, vamos a crear una base de Fourier para la regresión. Tenga en cuenta que, con $N = 2k+1$ realmente no tiene sentido crear más de $N-2$ funciones de base, es decir $N-3=2(k-1)$ sinusoidales y cosenoidales no constantes, ya que los componentes de frecuencia más alta se aliasan en una malla de este tipo. Por ejemplo, un seno de frecuencia $k\omega$ es indistinguible de un costante (seno): consideremos el caso de $N=3$ es decir, $k=1$ . De todas formas, si quieres volver a comprobarlo, sólo tienes que cambiar N-2
a N
en el siguiente fragmento y observe las dos últimas columnas: verá que en realidad son inútiles (y crean problemas para el ajuste, porque la matriz de diseño es ahora 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)
Obsérvese que las frecuencias son exactamente las correctas, pero las amplitudes de los componentes distintos de cero no lo son (1,2,3,4). La razón es que el fda
Las funciones de base de Fourier se escalan de una forma extraña: su valor máximo no es 1, como sería para la base de Fourier habitual ${1,\sin{ \omega x},\cos{ \omega x},\dots}$ . No es $\frac{1}{\sqrt \pi}$ tampoco, como lo habría sido para la base ortonormal de Fourier, ${\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)
Eso se ve claramente:
- el valor máximo es inferior a $\frac{1}{\sqrt \pi}$
- la base de Fourier (truncada a la primera $N-2$ ) contiene una función constante (la línea negra), senos de frecuencia creciente (las curvas que son iguales a 0 en los límites del dominio) y cosenos de frecuencia creciente (las curvas que son iguales a 1 en los límites del dominio), como debe ser
Basta con escalar la base de Fourier dada por fda
de forma que se obtenga la base de Fourier habitual, conduce a que los coeficientes de regresión tengan los valores esperados:
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")
Probemos fft
ahora: tenga en cuenta que como Yper
es una secuencia periódica, el último punto no añade realmente ninguna información (la DFT de una secuencia es siempre periódica). Por tanto, podemos descartar el último punto al calcular la FFT. Además, la FFT no es más que un algoritmo numérico rápido para calcular la DFT, y la DFT de una secuencia de números reales o complejos es compleja . Por tanto, lo que realmente queremos son los modulos de los coeficientes de la FFT:
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
Multiplicamos por $\frac{2}{N-1}$ para tener la misma escala que con la base de Fourier ${1,\sin{ \omega x},\cos{ \omega x},\dots}$ . Si no escaláramos, seguiríamos recuperando las frecuencias correctas, pero las amplitudes estarían todas escaladas por el mismo factor con respecto a lo que encontramos antes. Tracemos ahora los coeficientes fft:
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")
Vale: las frecuencias son correctas, pero ten en cuenta que ahora las funciones base ya no son senos y cosenos (son exponenciales complejas $\exp{ni\omega x}$ donde con $i$ I denota la unidad imaginaria). Obsérvese también que en lugar de un conjunto de frecuencias distintas de cero (1,2,3,4) como antes, obtenemos un conjunto (1,2,5). La razón es que un término $x_n\exp{ni\omega x}$ en esta expansión de coeficiente complejo (por tanto $x_n$ es complejo) corresponde a dos términos reales $a_n sin(n\omega x)+b_n cos(n\omega x)$ en la expansión de la base trigonométrica, debido a la fórmula de Euler $\exp{ix}=\cos{x}+i\sin{x}$ . El módulo del coeficiente complejo es igual a la suma en cuadratura de los dos coeficientes reales, es decir, $|x_n|=\sqrt{a_n^2+b_n^2}$ . De hecho, $5=\sqrt{3^3+4^2}$ .