Eles estão fortemente relacionados. Seu exemplo não é reproduzível porque você não incluiu seus dados, portanto, criarei um novo. Primeiro de tudo, vamos criar uma função 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)
Agora, vamos criar uma base de Fourier para regressão. Note que, comN= 2 k + 1, não faz muito sentido criar mais do que N- 2 funções básicas, ou seja, N- 3 = 2 ( k - 1 )senos e cossenos não constantes, porque os componentes de maior frequência são alias nessa grade. Por exemplo, um seno de frequênciak ω é indistinguível de um costante (seno): considere o caso de N= 3, ou seja, k = 1. De qualquer forma, se você quiser verificar novamente, basta alterar N-2
para N
no trecho abaixo e observar as duas últimas colunas: você verá que elas são realmente inúteis (e criam problemas para o ajuste, porque a matriz de design agora é 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)
Observe que as frequências são exatamente as corretas, mas as amplitudes de componentes diferentes de zero não são (1,2,3,4). O motivo é que as fda
funções da base de Fourier são dimensionadas de maneira estranha: seu valor máximo não é 1, como seria para a base usual de Fourier1 , pecadoω x ,cosω x ,…. Não é1π√ ou, como teria sido para a base ortonormal de Fourier, 12 π√, sinω xπ√, cosω xπ√, ….
# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)
Você vê claramente que:
- o valor máximo é menor que 1π√
- a base de Fourier (truncada para a primeira N- 2 termos) contém uma função constante (a linha preta), senos de frequência crescente (as curvas que são iguais a 0 nos limites do domínio) e cossenos de frequência crescente (as curvas que são iguais a 1 nos limites do domínio), como deveria estar
O simples dimensionamento da base de Fourier fornecida por fda
, para que a base usual de Fourier seja obtida, leva a coeficientes de regressão com os 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")
Vamos tentar fft
agora: observe que, como Yper
é uma sequência periódica, o último ponto não adiciona nenhuma informação (a DFT de uma sequência é sempre periódica). Assim, podemos descartar o último ponto ao calcular a FFT. Além disso, a FFT é apenas um algoritmo numérico rápido para calcular a DFT, e a DFT de uma sequência de números reais ou complexos é complexa . Assim, queremos realmente os módulos dos coeficientes da FFT:
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
Nós multiplicamos por 2N- 1 para ter o mesmo dimensionamento da base de Fourier 1 , pecadoω x ,cosω x ,…. Se não escalássemos, ainda assim recuperaríamos as frequências corretas, mas as amplitudes seriam todas escaladas pelo mesmo fator em relação ao que encontramos anteriormente. Vamos agora traçar os 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")
Ok: as frequências estão corretas, mas observe que agora as funções básicas não são mais senos e cossenos (são exponenciais complexas expn i ω xonde com EuDenomino a unidade imaginária). Observe também que, em vez de um conjunto de frequências diferentes de zero (1,2,3,4) como antes, obtivemos um conjunto (1,2,5). A razão é que um termoxnexpn i ω x nesta complexa expansão do coeficiente xn é complexo) corresponde a dois termos reais umans i n ( n ω x ) + bnc o s ( n ω x ) na expansão da base trigonométrica, por causa da fórmula de Euler expi x =cosx +ipecadox. O módulo do coeficiente complexo é igual à soma em quadratura dos dois coeficientes reais, ou seja,| xn| = a2n+ b2n------√. Na verdade,5 = 33+ 42------√.