Do ponto de vista estatístico: transformada de Fourier versus regressão com base em Fourier


13

Estou tentando entender se a transformada de Fourier discreta fornece a mesma representação de uma curva que uma regressão usando a base de Fourier. Por exemplo,

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)

A FFT fornece um número complexo, enquanto a regressão fornece um número real.

Eles transmitem a mesma informação? Existe um mapa individual entre os dois conjuntos de números?

(Eu apreciaria se a resposta fosse escrita da perspectiva do estatístico em vez da perspectiva do engenheiro. Muitos materiais on-line que posso encontrar têm jargões de engenharia em todo o lugar, o que os torna menos palatáveis ​​para mim.)


Não estou familiarizado com o seu trecho de código, portanto, não posso dizer se o seguinte problema se aplica a ele. No entanto, normalmente a base DFT é definida em termos de frequências integrais ("número inteiro"), enquanto uma "base quadriênica" geral para regressão pode usar taxas de frequência arbitrárias (por exemplo, incluindo irracionais, pelo menos em aritmética contínua). Isso também pode ser interessante.
GeoMatt22

Acho que todos se beneficiariam se você escrever sua pergunta em termos matemáticos (em vez de trechos de código). Qual é o problema de regressão que você resolve? Quais são as funções básicas de Fourier que você usa? Você ficará surpreso com o aprimoramento das respostas à sua pergunta.
Yair Daon

Respostas:


15

Eles são iguais. Aqui está como ...

Fazendo uma regressão

Diga que encaixa no modelo , onde t = 1 , ... , N e n = andar ( N / 2 ) . Porém, isso não é adequado para regressão linear; portanto, você usa alguma trigonometria ( cos ( a + b ) = cos

yt=j=1nUMAjporque(2πt[j/N]+ϕj)
t=1,...,Nn=chão(N/2) ) e ajuste o modelo equivalente: y t = n j = 1 β 1 , j cos ( 2 π t [ j / N ] ) + β 2 , j sin ( 2 π t [ j / N ] ) .porque(uma+b)=porque(uma)porque(b)-pecado(uma)pecado(b)
yt=j=1nβ1,jporque(2πt[j/N])+β2,jpecado(2πt[j/N]).
Executando regressão linear em todas as frequências de Fourier dá-lhe um grupo ( 2 N ) de betas: { β i , j } , i = 1 , 2 . Para qualquer j , se você quiser calcular o par manualmente, poderá usar:{j/N:j=1,,n}2n{β^i,j}i=1,2j

e β 2,j=Σ N t = 1 ytsin(2πt[j/N])

β^1,j=t=1Nytcos(2πt[j/N])t=1Ncos2(2πt[j/N])
Estas são fórmulas de regressão padrão.
β^2,j=t=1Nytsin(2πt[j/N])t=1Nsin2(2πt[j/N]).

Fazendo uma transformação discreta de Fourier

Quando você executa uma transformação de Fourier, calcula, para :j=1,,n

d(j/N)=N1/2t=1Nytexp[2πit[j/N]]=N-1/2(t=1Nytporque(2πt[j/N])-Eut=1Nytpecado(2πt[j/N])).

EueEux=porque(x)+Eupecado(x)porque(-x)=porque(x)pecado(-x)=-pecado(x)

j

|d(j/N)|2=N-1(t=1Nytporque(2πt[j/N]))2+N-1(t=1Nytpecado(2πt[j/N]))2.
Em R, calcular esse vetor seria I <- abs(fft(Y))^2/length(Y), o que é meio estranho, porque você precisa escalá-lo.

P(j/N)=(2Nt=1Nytporque(2πt[j/N]))2+(2Nt=1Nytpecado(2πt[j/N]))2.
P(j/N)=4N|d(j/N)|2. Em R isso seria P <- (4/length(Y))*I[(1:floor(length(Y)/2))].

A conexão entre os dois

Acontece que a conexão entre a regressão e os dois periodogramas é:

P(j/N)=β^1,j2+β^2,j2.
Por quê? Porque a base que você escolheu é ortogonal / ortonormal. Você pode mostrar para cadaj naquela t=1Nporque2(2πt[j/N])=t=1Npecado2(2πt[j/N])=N/2. Conecte isso aos denominadores de suas fórmulas para os coeficientes de regressão e pronto.

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


1
+1 para a resposta e a fonte. Também seria bom se você pudesse demonstrar o resultado com os Robjetos que publiquei.
Qheleth

@qoheleth Vou deixar isso para você. Apenas esteja cansado de como fft()não dimensiona a maneira como escrevi (eu já mencionei isso), que eu não provei nada com interceptações e que create.fourier.basis()dimensiona as funções básicas de maneira estranha.
Taylor

6

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)

insira a descrição da imagem aqui

Agora, vamos criar uma base de Fourier para regressão. Note que, comN=2k+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-2para Nno 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)

insira a descrição da imagem aqui

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 fdafunçõ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,porqueωx,.... Não é1π ou, como teria sido para a base ortonormal de Fourier, 12π,pecadoωxπ,porqueωxπ,....

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

insira a descrição da imagem aqui

Você vê claramente que:

  1. o valor máximo é menor que 1π
  2. 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")

insira a descrição da imagem aqui

Vamos tentar fftagora: 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,porqueω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")

insira a descrição da imagem aqui

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 expnEuω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 termoxnexpnEuωx nesta complexa expansão do coeficiente xn é complexo) corresponde a dois termos reais umansEun(nωx)+bncos(nωx) na expansão da base trigonométrica, por causa da fórmula de Euler expEux=porquex+Eupecadox. O módulo do coeficiente complexo é igual à soma em quadratura dos dois coeficientes reais, ou seja,|xn|=uman2+bn2. Na verdade,5=33+42.


1
graças DeltaIV, os dados dailyvêm com o fdapacote.
Qheleth

@qoheleth eu não sabia. Esta noite, modificarei minha resposta usando seu conjunto de dados e esclarecerei alguns pontos.
DeltaIV
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.