Aus statistischer Sicht: Fourier-Transformation vs. Regression auf Fourier-Basis


13

Ich versuche zu verstehen, ob die diskrete Fourier-Transformation die gleiche Darstellung einer Kurve wie eine Regression auf Fourier-Basis liefert. Beispielsweise,

library(fda)
Y=daily$tempav[,1] ## my data
length(Y) ## =365

## create Fourier basis and estimate the coefficients
mybasis=create.fourier.basis(c(0,365),365)  
basisMat=eval.basis(1:365,mybasis)
regcoef=coef(lm(Y~basisMat-1))

## using Fourier transform
fftcoef=fft(Y)

## compare
head(fftcoef)
head(regcoef)

FFT gibt eine komplexe Zahl an, während Regression eine reelle Zahl ergibt.

Vermitteln sie die gleichen Informationen? Gibt es eine Eins-zu-Eins-Zuordnung zwischen den beiden Zahlengruppen?

(Ich würde es begrüßen, wenn die Antwort aus Sicht des Statistikers statt aus Sicht des Ingenieurs geschrieben würde. Viele Online-Materialien, die ich finden kann, enthalten überall Fachjargon, was sie für mich weniger schmackhaft macht.)


Ich kenne Ihr Code-Snippet nicht und kann daher nicht sagen, ob das folgende Problem dort auftritt. Typischerweise wird die DFT-Basis jedoch in Form von ganzzahligen ("ganzzahligen") Frequenzen definiert, wohingegen eine allgemeine "Fourier-Basis" für die Regression beliebige Frequenzverhältnisse verwenden könnte (z. B. einschließlich Irrationalen, zumindest in kontinuierlicher Arithmetik). Dies könnte auch von Interesse sein.
GeoMatt22

Ich denke, jeder würde davon profitieren, wenn Sie Ihre Frage in mathematischen Begriffen schreiben (im Gegensatz zu Codeausschnitten). Was ist das Regressionsproblem, das Sie lösen? Welche Fourier-Basisfunktionen verwenden Sie? Sie werden überrascht sein, wie sich die Antworten auf Ihre Frage verbessern.
Yair Daon

Antworten:


15

Sie sind die gleichen. Hier ist wie...

Eine Regression durchführen

Angenommen, Sie passen das Modell mit t = 1 , , N und n = Boden ( N / 2 ) an . Dies ist jedoch nicht für die lineare Regression geeignet. Verwenden Sie stattdessen eine Trigonometrie ( cos ( a + b ) = cos

yt=j=1nEINjcos(2πt[j/N]+ϕj)
t=1,,Nn=Fußboden(N/2) ) und paßt das äquivalente Modell: y t = n Σ j = 1 β 1 , j cos ( 2 π t [ j / N ] ) + β 2 , j sin ( 2 & pgr; t [ j / N ] ) .cos(ein+b)=cos(ein)cos(b)-Sünde(ein)Sünde(b)
yt=j=1nβ1,jcos(2πt[j/N])+β2,jSünde(2πt[j/N]).
Laufende lineare Regression auf alle der Fourier - Frequenzen gibt Ihnen ein Bündel ( 2 n ) von Betas: { β i , j } , i = 1 , 2 . Für jedes j können Sie Folgendes verwenden , wenn Sie das Paar von Hand berechnen möchten:{j/N:j=1,,n}2n{β^ich,j}ich=1,2j

β^1,j=t=1Nytcos(2πt[j/N])t=1Ncos2(2πt[j/N])
β^2,j=t=1Nytsin(2πt[j/N])t=1Nsin2(2πt[j/N]).

Eine diskrete Fourier-Transformation durchführen

j=1,,n

d(j/N)=N1/2t=1Nytexp[2πit[j/N]]=N1/2(t=1Nytcos(2πt[j/N])it=1Nytsin(2πt[j/N])).

This is a complex number (notice the i). To see why that equality holds, keep in mind that eix=cos(x)+isin(x), cos(x)=cos(x) and sin(x)=sin(x).

For each j, taking the square of the complex conjugate gives you the "periodogram:"

|d(j/N)|2=N1(t=1Nytcos(2πt[j/N]))2+N1(t=1Nytsin(2πt[j/N]))2.
In R, calculating this vector would be I <- abs(fft(Y))^2/length(Y), which is sort of weird, because you have to scale it.

Also you can define the "scaled periodogram"

P(j/N)=(2Nt=1Nytcos(2πt[j/N]))2+(2Nt=1Nytsin(2πt[j/N]))2.
Clearly P(j/N)=4N|d(j/N)|2. In R this would be P <- (4/length(Y))*I[(1:floor(length(Y)/2))].

The Connection Between the Two

It turns out the connection between the regression and the two periodograms is:

P(j/N)=β^1,j2+β^2,j2.
Why? Because the basis you chose is orthogonal/orthonormal. You can show for each j that t=1Ncos2(2πt[j/N])=t=1Nsin2(2πt[j/N])=N/2. Plug that in to the denominators of your formulas for the regression coefficients and voila.

Source: https://www.amazon.com/Time-Analysis-Its-Applications-Statistics/dp/144197864X


1
+1 for the answer and the source. It would also be good if you can demonstrate the result with the R objects I posted.
qoheleth

@ qoheleth Das überlasse ich dir. Sei einfach müde davon, wie ich meine fft()Texte nicht skaliere (ich habe das bereits erwähnt), dass ich mit Intercepts nichts bewiesen habe und dass create.fourier.basis()die Basisfunktionen komisch skaliert werden.
Taylor

6

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)

Bildbeschreibung hier eingeben

Erstellen wir nun eine Fourier-Basis für die Regression. Beachten Sie, dass mitN=2k+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-2um Nim 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)

Bildbeschreibung hier eingeben

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 fdaFourier-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π,Sündeωxπ,cosωxπ,.

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

Bildbeschreibung hier eingeben

Sie sehen deutlich, dass:

  1. Der Maximalwert ist kleiner als 1π
  2. 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")

Bildbeschreibung hier eingeben

Versuchen wir es fftjetzt: Beachten Sie, dass Yperder 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")

Bildbeschreibung hier eingeben

Ok: Die Frequenzen sind korrekt, aber beachten Sie, dass die Basisfunktionen jetzt keine Sinus- und Cosinusfunktionen mehr sind (sie sind komplexe Exponentiale) expnichω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 Begriffxnexpnichωx in dieser komplexen Koeffizientenexpansion (also xn ist komplex) entspricht zwei reellen Begriffen einnsichn(nωx)+bncÖs(nωx) in der trigonometrischen Basiserweiterung aufgrund der Euler-Formel expichx=cosx+ichSündex. Der Modul des komplexen Koeffizienten ist gleich der Quadratursumme der beiden reellen Koeffizienten, dh|xn|=einn2+bn2. In der Tat,5=33+42.


1
Dank DeltaIV kommen die Daten dailymit dem fdaPaket.
Qoheleth

@ Qoheleth wusste ich nicht. Heute Abend werde ich meine Antwort anhand Ihres Datensatzes ändern und einige Punkte klären.
DeltaIV
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.