İstatistiksel bakış açısından: Fourier temelli Fourier dönüşümü ve regresyon


13

Ayrık Fourier dönüşümünün bir eğrinin Fourier temelini kullanarak bir regresyon ile aynı temsilini verip vermediğini anlamaya çalışıyorum. Örneğin,

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 karmaşık bir sayı verirken, regresyon gerçek bir sayı verir.

Aynı bilgiyi veriyorlar mı? İki sayı kümesi arasında bire bir harita var mı?

(Cevabın mühendis perspektifi yerine istatistikçinin perspektifinden yazıldığını takdir ediyorum. Bulabildiğim birçok çevrimiçi malzemenin her yerinde mühendislik jargonu var, bu da onları daha az lezzetli yapıyor.)


Kod snippet'inize aşina değilim, bu yüzden aşağıdaki sorunun orada geçerli olup olmadığını söyleyemeyiz. Bununla birlikte, tipik olarak DFT temeli integral ("tam sayı") frekansları cinsinden tanımlanırken, regresyon için genel bir "fourier temeli" keyfi frekans oranları (örneğin en azından sürekli aritmetik olarak irrasyonel dahil) kullanabilir. Bu da ilgi çekici olabilir.
GeoMatt22

Sorunuzu matematik terimleriyle yazdığınızda (kod parçacıklarının aksine) herkesin fayda sağlayacağını düşünüyorum. Çözdüğünüz regresyon problemi nedir? Kullandığınız Fourier temeli işlevleri nelerdir? Sorunuzun cevaplarının nasıl gelişeceğine şaşıracaksınız.
Yair Daon

Yanıtlar:


15

Onlar aynı. İşte böyle ...

Regresyon Yapmak

Eğer modeli uygun ki ve . Bu doğrusal regresyon için uygun değildir, bunun yerine bazı trigonometri ( ) kullanırsınız ve eşdeğer model: tüm Fourier frekanslarında doğrusal regresyon çalıştırmak size bir demet beta ( ) verir : , . Herhangi bir

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]).
{j/N:j=1,,n}2n{β^i,j}i=1,2j, çifti el ile hesaplamak istiyorsanız şunları kullanabilirsiniz:

β^1,j=t=1Nytcos(2πt[j/N])t=1Ncos2(2πt[j/N])
ve Bunlar standart regresyon formülleridir.
β^2,j=t=1Nytsin(2πt[j/N])t=1Nsin2(2πt[j/N]).

Ayrık Fourier Dönüşümü Yapma

Bir Fourier dönüşümü çalıştırdığınızda, için şunu hesaplarsınız :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])).

Bu karmaşık bir sayıdır ( dikkat edin ). Bu eşitliğin neden geçerli olduğunu görmek için, , ve .ieix=cos(x)+isin(x)cos(x)=cos(x)sin(x)=sin(x)

Her , kompleks konjugatın karesini almak size " periodogram :"j

|d(j/N)|2=N1(t=1Nytcos(2πt[j/N]))2+N1(t=1Nytsin(2πt[j/N]))2.
R'de, bu vektörün hesaplanması I <- abs(fft(Y))^2/length(Y), tuhaftır, çünkü onu ölçeklemelisiniz.

Ayrıca " ölçekli periodogram " Açıkça . R'de bu olurdu .

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))]

İkisi Arasındaki Bağlantı

Regresyon ile iki periodogram arasındaki bağlantı şu şekildedir:

P(j/N)=β^1,j2+β^2,j2.
Neden? Çünkü seçtiğiniz temel dik / ortonormaldir. Her bir için . Regresyon katsayıları ve voila için formüllerinizin paydalarına takın.jt=1Ncos2(2πt[j/N])=t=1Nsin2(2πt[j/N])=N/2

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


1
Cevap ve kaynak için +1. RSonucu yayınladığım nesnelerle gösterebilirseniz de iyi olur .
qoheleth

@ qoheleth Bunu sana bırakacağım. Yazma fft()şeklimizi nasıl ölçeklemediğimi (bundan daha önce bahsetmiştim), kesişme ile hiçbir şey kanıtlamadığım create.fourier.basis()ve temel işlevlerin garip bir şekilde ölçeklendiği konusunda yorgun olun .
Taylor

6

Bunlar güçlü bir şekilde ilişkilidir. Örneğiniz tekrarlanamaz çünkü verilerinizi eklemediniz, bu yüzden yeni bir tane yapacağım. Her şeyden önce, periyodik bir fonksiyon oluşturalım:

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)

resim açıklamasını buraya girin

Şimdi regresyon için bir Fourier temeli oluşturalım. Dikkate alınmalıdır ki, birlikte , gerçekten anlamda daha fazlasını oluşturmak için yapmaz , baz fonksiyonları, yani sabit olmayan sinüs ve kosinüs, çünkü yüksek frekans bileşenleri böyle bir ızgarada takma addır. Örneğin, frekansının bir sinüsü bir kostandan (sinüs) ayırt edilemez: , yani örneğini düşünün . Eğer iki kez kontrol etmek istiyorsanız, yine de, sadece değiştirmek için son iki sütunda aşağıda pasajı ve görünüm: Eğer aslında yararsız olduğunu göreceksiniz (ve tasarım matrisi şimdi tekil çünkü onlar, oturması için sorunları oluşturabilir ).N=2k+1N2N3=2(k1)kωN=3k=1N-2N

# 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)

resim açıklamasını buraya girin

Frekansların tam olarak doğru olduğunu, ancak sıfır olmayan bileşenlerin genliklerinin (1,2,3,4) olmadığını unutmayın. Bunun nedeni, fdaFourier temel işlevlerinin garip bir şekilde ölçeklendirilmesidir: maksimum değerleri 1 değildir, olağan Fourier temeli . O değil ya da ortonormal Fourier bazında için olurdu gibi .1,sinωx,cosωx,1π12π,sinωxπ,cosωxπ,

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

resim açıklamasını buraya girin

Bunu açıkça görüyorsunuz:

  1. maksimum değer değerinden küçük1π
  2. Fourier temeli (ilk terimleriyle kesilmiş ) sabit bir fonksiyon (siyah çizgi), artan frekans sinüsleri (alan sınırlarında 0'a eşit olan eğriler) ve artan frekansın kosinüslerini ( alan sınırlarında 1'e eşittir)N2

Basitçe verilen Fourier tabanının ölçeklendirilmesi fda, böylece olağan Fourier tabanının elde edilmesi, beklenen değerlere sahip regresyon katsayılarına yol açar:

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")

resim açıklamasını buraya girin

Şimdi deneyelim fft: Yperperiyodik bir dizi olduğu için, son noktanın gerçekten herhangi bir bilgi eklemediğine dikkat edin (bir dizinin DFT'si her zaman periyodiktir). Böylece FFT'yi hesaplarken son noktayı atabiliriz. Ayrıca, FFT, DFT'yi hesaplamak için sadece hızlı bir sayısal algoritmadır ve bir dizi gerçek veya karmaşık sayının DFT'si karmaşıktır . Bu nedenle, FFT katsayılarının modüllerini gerçekten istiyoruz:

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

İle çarpınız Biz Fourier bazında olduğu gibi aynı ölçeğe sahip olmak için . Ölçeklemeseydik, yine de doğru frekansları geri kazanırdık, ancak genliklerin hepsi daha önce bulduğumuzla aynı faktörle ölçeklendirilirdi. Şimdi fft katsayılarını çizelim:2N11,sinωx,cosωx,

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")

resim açıklamasını buraya girin

Tamam: frekanslar doğru, ama şimdi temel fonksiyonların artık sinüs ve kosinüs olmadığını unutmayın (karmaşık üstel , burada ile hayali birimi belirtiyorum). Ayrıca daha önce olduğu gibi sıfır olmayan bir frekans kümesi (1,2,3,4) yerine bir küme (1,2,5) elde ettiğimizi unutmayın. Bunun nedeni bir terimdir , bu karmaşık katsayısı genişleme (böylece iki reel tekabül karmaşıktır) içinde Euler formülü nedeniyle trigonometrik temelde genişleme . Karmaşık katsayının modülü, iki gerçek katsayının kareleme toplamına eşittir, yani,expniωxixnexpniωxxnansin(nωx)+bncos(nωx)expix=cosx+isinx 5=|xn|=an2+bn2 . Nitekim .5=33+42


1
DeltaIV sayesinde, veriler dailypaketle birlikte gelir fda.
qoheleth

@ qoheleth bilmiyordum. Bu akşam veri setinizi kullanarak cevabımı değiştireceğim ve birkaç noktayı açıklığa kavuşturacağım.
DeltaIV
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.