Sie sind eng miteinander verwandt. Ihr Beispiel ist nicht reproduzierbar, weil Sie Ihre Daten nicht angegeben haben. Daher erstelle ich eine neue. Zunächst erstellen wir eine periodische Funktion:
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)
Erstellen wir nun eine Fourier-Basis für die Regression. Beachten Sie, dass mitN= 2 k + 1Es macht eigentlich keinen Sinn, mehr zu schaffen als N- 2 Basisfunktionen, dh N- 3 = 2 ( k - 1 )Nicht konstante Sinus- und Cosinus-Werte, da in einem solchen Gitter höherfrequente Komponenten aliasiert sind. Zum Beispiel ein Sinus der Frequenzk ω ist nicht von einem Costant (Sinus) zu unterscheiden: Betrachten Sie den Fall von N= 3dh k = 1. Wie auch immer, wenn Sie überprüfen möchten, ändern , nur N-2
um N
im Snippet unten und Blick auf den letzten zwei Spalten: Sie werden sehen , dass sie eigentlich nutzlos sind (und sie schaffen Probleme für die Passform, denn die Design - Matrix nun singulär ).
# 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)
Beachten Sie, dass die Frequenzen genau die richtigen sind, die Amplituden von Nicht-Null-Komponenten jedoch nicht (1,2,3,4). Der Grund ist, dass die fda
Fourier-Basisfunktionen auf seltsame Weise skaliert sind: Ihr Maximalwert ist nicht 1, wie dies für die übliche Fourier-Basis der Fall wäre1 , Sündeω x ,cosω x ,…. Es ist nicht1π√ entweder, wie es für die orthonormale Fourier-Basis gewesen wäre, 12 π√, sinω xπ√, cosω xπ√, ….
# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)
Sie sehen deutlich, dass:
- Der Maximalwert ist kleiner als 1π√
- die Fourier - Basis (auf die erste abgeschnitten) N- 2 Ausdrücke) enthält eine konstante Funktion (die schwarze Linie), Sinus mit zunehmender Frequenz (die Kurven, die an den Domänengrenzen gleich 0 sind) und Cosinus mit zunehmender Frequenz (die Kurven, die an den Domänengrenzen gleich 1 sind) sollte sein
Das einfache Skalieren der durch gegebenen Fourier-Basis fda
, so dass die übliche Fourier-Basis erhalten wird, führt zu Regressionskoeffizienten mit den erwarteten Werten:
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")
Versuchen wir es fft
jetzt: Beachten Sie, dass Yper
der letzte Punkt keine Informationen hinzufügt , da es sich um eine periodische Sequenz handelt (die DFT einer Sequenz ist immer periodisch). Somit können wir den letzten Punkt bei der Berechnung der FFT verwerfen. Außerdem ist die FFT nur ein schneller numerischer Algorithmus zur Berechnung der DFT, und die DFT einer Folge von reellen oder komplexen Zahlen ist komplex . Wir wollen also unbedingt die Module der FFT-Koeffizienten:
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
Wir multiplizieren mit 2N- 1 um die gleiche Skalierung wie bei der Fourier-Basis zu haben 1 , Sündeω x ,cosω x ,…. Wenn wir nicht skalieren würden, würden wir immer noch die richtigen Frequenzen wiederherstellen, aber die Amplituden würden alle um den gleichen Faktor in Bezug auf das skaliert, was wir zuvor gefunden haben. Zeichnen wir nun die fft-Koeffizienten:
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: Die Frequenzen sind korrekt, aber beachten Sie, dass die Basisfunktionen jetzt keine Sinus- und Cosinusfunktionen mehr sind (sie sind komplexe Exponentiale) expn i ω xwo mit ichIch bezeichne die imaginäre Einheit. Beachten Sie auch, dass wir anstelle einer Reihe von Frequenzen ungleich Null (1,2,3,4) wie zuvor eine Reihe (1,2,5) erhalten haben. Der Grund ist, dass ein Begriffxnexpn i ω x in dieser komplexen Koeffizientenexpansion (also xn ist komplex) entspricht zwei reellen Begriffen einns i n ( n ω x ) + bnc o s ( n ω x ) in der trigonometrischen Basiserweiterung aufgrund der Euler-Formel expi x =cosx +ichsinx. Der Modul des komplexen Koeffizienten ist gleich der Quadratursumme der beiden reellen Koeffizienten, dh| xn| = a2n+ b2n------√. In der Tat,5 = 33+ 42------√.