Desde una perspectiva estadística: transformada de Fourier vs regresión con base de Fourier


13

Estoy tratando de entender si la transformada discreta de Fourier ofrece la misma representación de una curva que una regresión utilizando la base de Fourier. Por ejemplo,

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 da un número complejo, mientras que la regresión da un número real.

¿Transmiten la misma información? ¿Hay un mapa uno a uno entre los dos conjuntos de números?

(Agradecería que la respuesta se escriba desde la perspectiva del estadístico en lugar de la perspectiva del ingeniero. Muchos materiales en línea que puedo encontrar tienen jerga de ingeniería en todo el lugar, lo que los hace menos sabrosos para mí).


No estoy familiarizado con su fragmento de código, por lo que no puedo decir si el siguiente problema se aplica allí. Sin embargo, típicamente la base DFT se define en términos de frecuencias integrales ("número entero"), mientras que una "base de Fourier" general para la regresión podría usar relaciones de frecuencia arbitrarias (por ejemplo, que incluyen irracionales, al menos en aritmética continua). Esto también podría ser de interés.
GeoMatt22

Creo que todos se beneficiarían si escribes tu pregunta en términos matemáticos (a diferencia de los fragmentos de código). ¿Cuál es el problema de regresión que resuelves? ¿Cuáles son las funciones básicas de Fourier que utiliza? Se sorprenderá de cómo mejorarán las respuestas a su pregunta.
Yair Daon

Respuestas:


15

Son lo mismo Así es cómo...

Haciendo una regresión

Digamos que se ajusta al modelo , donde t = 1 , ... , N y n = suelo ( N / 2 ) . Sin embargo, esto no es adecuado para la regresión lineal, por lo que utiliza trigonometría ( cos ( a + b ) = cost= n Ejecutando regresión lineal en todas las frecuencias de Fourier{j/N: ( a ) cos ( b ) - sin ( a ) sin ( b ) ) y se ajusta al modelo equivalente: y

yt=j=1nAjcos(2πt[j/N]+ϕj)
t=1,,Nn=floor(N/2)cos(a+b)=cos(a)cos(b)sin(a)sin(b)
yt=j=1nβ1,jcos(2πt[j/N])+β2,jsin(2πt[j/N]).
le da un montón ( 2 n ) de betas: { β i , j } , i = 1 , 2 . Para cualquier j , si desea calcular el par a mano, puede usar:{j/N:j=1,,n}2n{β^i,j}i=1,2j

y β 2,j=Σ N t = 1 ytpecado(2πt[j/N])

β^1,j=t=1Nytcos(2πt[j/N])t=1Ncos2(2πt[j/N])
Estas son fórmulas de regresión estándar.
β^2,j=t=1Nytsin(2πt[j/N])t=1Nsin2(2πt[j/N]).

Hacer una transformada discreta de Fourier

Cuando ejecuta una transformación de Fourier, calcula, para :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])).

Este es un número complejo (observe la ). Para ver por qué se mantiene esa igualdad, tenga en cuenta que e i x = cos ( x ) + i sini , cos ( - x ) = cos ( x ) y sin ( - x ) = - sin ( x ) .eix=cos(x)+isin(x)cos(x)=cos(x)sin(x)=sin(x)

Para cada , tomar el cuadrado del conjugado complejo te da el " periodograma :"j

|d(j/N)|2=N1(t=1Nytcos(2πt[j/N]))2+N1(t=1Nytsin(2πt[j/N]))2.
En R, calcular este vector sería I <- abs(fft(Y))^2/length(Y), lo cual es un poco extraño, porque tienes que escalarlo.

También puede definir el " periodograma escalado "

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

La conexión entre los dos

Resulta que la conexión entre la regresión y los dos periodogramas es:

P(j/N)=β^1,j2+β^2,j2.
jt=1Ncos2(2πt[j/N])=t=1Nsin2(2πt[j/N])=N/2

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


1
+1 para la respuesta y la fuente. También sería bueno si puedes demostrar el resultado con los Robjetos que publiqué.
qoheleth

@ qoheleth te lo dejo a ti. Solo esté cansado de cómo fft()no escala la forma en que escribí (ya mencioné esto), que no he probado nada con las intercepciones, y eso create.fourier.basis()escala las funciones de la base de manera extraña.
Taylor

6

Están fuertemente relacionados. Su ejemplo no es reproducible porque no incluyó sus datos, por lo que haré uno nuevo. En primer lugar, creemos 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)

ingrese la descripción de la imagen aquí

N=2k+1N2N3=2(k1)kωnorte=3k=1. De todos modos, si quieres comprobarlo, basta con cambiar N-2a Nen el siguiente fragmento de código y vistazo a las últimas dos columnas: verá que en realidad son inútiles (y que crea problemas para el ajuste, debido a que la matriz de diseño ahora es 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

Tenga en cuenta 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 las fdafunciones básicas de Fourier se escalan de una manera extraña: su valor máximo no es 1, como sería para la base de Fourier habitual1,pecadoωX,cosωX,.... No es1π tampoco, como habría sido para la base de Fourier ortonormal, 12π,pecadoωXπ,cosωXπ,....

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

enter image description here

Usted ve claramente que:

  1. el valor máximo es menor que 1π
  2. la base de Fourier (truncada a la primera norte-2 términos) 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), ya que debiera ser

Simplemente escalar la base de Fourier dada por fda, para que se obtenga la base de Fourier habitual, conduce a coeficientes de regresión que tienen 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")

enter image description here

Probemos fftahora: tenga en cuenta que, dado que Yperes una secuencia periódica, el último punto realmente no agrega ninguna información (el DFT de una secuencia siempre es periódico). Por lo tanto, podemos descartar el último punto al calcular la FFT. Además, el FFT es solo un algoritmo numérico rápido para calcular el DFT, y el DFT de una secuencia de números reales o complejos es complejo . Por lo tanto, realmente queremos los módulos de los coeficientes FFT:

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

Multiplicamos por 2norte-1 para tener la misma escala que con la base de Fourier 1,pecadoωX,cosωX,.... Si no escalamos, aún recuperaríamos las frecuencias correctas, pero todas las amplitudes serían 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")

enter image description here

Ok: las frecuencias son correctas, pero tenga en cuenta que ahora las funciones básicas ya no son senos y cosenos (son exponenciales complejos ExpnorteyoωX, donde con yoDenote la unidad imaginaria). Tenga en cuenta también que en lugar de un conjunto de frecuencias distintas de cero (1,2,3,4) como antes, obtuvimos un conjunto (1,2,5). La razón es que un términoXnorteExpnorteyoωX en este complejo coeficiente de expansión (por lo tanto Xnorte es complejo) corresponde a dos términos reales unnortesyonorte(norteωX)+sinorteCos(norteωX) en la expansión de la base trigonométrica, debido a la fórmula de Euler ExpyoX=cosX+yopecadoX. The modulus of the complex coefficient is equal to the sum in quadrature of the two real coefficients, i.e., |xn|=an2+bn2. As a matter of fact, 5=33+42.


1
thanks DeltaIV, the data daily comes with the fda package.
qoheleth

@qoheleth I didn't know. This evening I will modify my answer using your dataset, and I will clarify a couple points.
DeltaIV
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.