จากมุมมองทางสถิติ: การแปลงฟูริเยร์กับการถดถอยด้วยพื้นฐานของฟูริเยร์


13

ฉันพยายามที่จะเข้าใจว่าการแปลงฟูริเยร์ไม่ต่อเนื่องนั้นให้เส้นโค้งเดียวกับการถดถอยโดยใช้พื้นฐานของฟูริเยร์หรือไม่ ตัวอย่างเช่น,

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 ให้จำนวนเชิงซ้อนในขณะที่การถดถอยให้จำนวนจริง

พวกเขาถ่ายทอดข้อมูลเดียวกันหรือไม่? มีแผนที่หนึ่งถึงหนึ่งระหว่างตัวเลขสองชุดหรือไม่

(ฉันจะขอบคุณถ้าคำตอบนั้นเขียนจากมุมมองของนักสถิติแทนที่จะเป็นมุมมองของวิศวกรวัสดุออนไลน์มากมายที่ฉันสามารถหาได้มีศัพท์แสงทางวิศวกรรมทั่วสถานที่ซึ่งทำให้ฉันพอใจน้อยลง)


ฉันไม่คุ้นเคยกับข้อมูลโค้ดของคุณดังนั้นจึงไม่สามารถพูดได้ว่ามีปัญหาต่อไปนี้หรือไม่ แต่มักจะเป็นพื้นฐาน DFT ถูกกำหนดไว้ในแง่ของหนึ่ง ( "จำนวนทั้งหมด") ความถี่ในขณะที่นายพล "พื้นฐานฟูริเยร์" สำหรับการถดถอยสามารถใช้อัตราส่วนข้อความถี่ (เช่นรวมทั้ง irrationals อย่างน้อยในการคำนวณต่อเนื่อง) สิ่งนี้อาจเป็นที่สนใจ
GeoMatt22

ฉันคิดว่าทุกคนจะได้ประโยชน์ถ้าคุณเขียนคำถามของคุณในแง่คณิตศาสตร์ (ตรงข้ามกับตัวอย่างโค้ด) ปัญหาการถดถอยที่คุณแก้ไขคืออะไร ฟังก์ชันพื้นฐานของฟูริเยร์คุณใช้อะไร? คุณจะประหลาดใจที่คำตอบของคำถามจะดีขึ้นอย่างไร
Yair Daon

คำตอบ:


15

พวกเขาเหมือนกัน นี่คือวิธี ...

ทำถดถอย

สมมติว่าคุณเหมาะสมกับรูปแบบ ที่T = 1 , ... , Nและn = ชั้น( N / 2 ) สิ่งนี้ไม่เหมาะสำหรับการถดถอยเชิงเส้นดังนั้นแทนที่จะใช้ตรีโกณมิติ ( cos ( a + b ) = cos แทน

yt=j=1nAjcos(2πt[j/N]+ϕj)
t=1,,Nn=floor(N/2) ) และพอดีกับโมเดลที่เทียบเท่า: y t = n j = 1 β 1 , j cos ( 2 π t [ j / N ] ) + β 2 , เจบาป( 2 π T [ J / N ] )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]).
เล่นการถดถอยเชิงเส้นในทุกความถี่ฟูริเยร์ช่วยให้คุณพวง ( 2 n ) ของเบต้า: { βฉัน, J } , ฉัน= 1 , 2 สำหรับjใด ๆหากคุณต้องการคำนวณทั้งคู่ด้วยมือคุณสามารถใช้:{j/N:j=1,,n}2n{β^i,j}i=1,2j

และ β 2,J=Σ N T = 1ปีเสื้อบาป(2πT[J/N])

β^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]).

ทำการแปลงฟูริเยร์แบบไม่ต่อเนื่อง

เมื่อคุณทำการแปลงฟูริเยร์คุณจะคำนวณสำหรับ :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])).

ieix=cos(x)+isin(x)cos(x)=cos(x)sin(x)=sin(x)

j

|d(j/N)|2=N1(t=1Nytcos(2πt[j/N]))2+N1(t=1Nytsin(2πt[j/N]))2.
ใน R การคำนวณเวกเตอร์นี้น่าจะI <- abs(fft(Y))^2/length(Y)แปลกเพราะคุณต้องขยายมัน

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

การเชื่อมต่อระหว่างคนทั้งสอง

มันจะเปิดการเชื่อมต่อระหว่างการถดถอยและสองช่วงเวลาคือ:

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

ที่มา: https://www.amazon.com/Time-Analysis-Its-Applications-Statistics/dp/144197864X


1
+1 สำหรับคำตอบและแหล่งที่มา มันก็จะดีถ้าคุณสามารถแสดงผลกับRวัตถุที่ฉันโพสต์
qoheleth

@qoheleth ฉันจะทิ้งคุณไว้ เพียงแค่มีความเหนื่อยล้าของวิธีการที่fft()ไม่ได้ระดับวิธีการที่ผมเขียน (ที่ผมกล่าวถึงนี้แล้ว) ที่ฉันไม่ได้รับการพิสูจน์อะไรกับดักและcreate.fourier.basis()เครื่องชั่งน้ำหนักฟังก์ชั่นพื้นฐานที่วิจิตรพิสดาร
เทย์เลอร์

6

พวกเขาเกี่ยวข้องอย่างยิ่ง ตัวอย่างของคุณไม่สามารถทำซ้ำได้เพราะคุณไม่ได้รวมข้อมูลของคุณดังนั้นฉันจะสร้างใหม่ ก่อนอื่นเรามาสร้างฟังก์ชั่นเป็นคาบ:

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)

ป้อนคำอธิบายรูปภาพที่นี่

N=2k+1N2N3=2(k1)kωN=3k=1. อย่างไรก็ตามถ้าคุณต้องการที่จะตรวจสอบอีกครั้งเพียงแค่เปลี่ยนN-2ไปNในตัวอย่างด้านล่างและดูที่สองคอลัมน์ล่าสุด: คุณจะเห็นว่าพวกเขากำลังไร้ประโยชน์จริง (และพวกเขาสร้างปัญหาพอดีเพราะเมทริกซ์ออกแบบคือตอนนี้เอกพจน์ )

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

ป้อนคำอธิบายรูปภาพที่นี่

fda1,sinωx,cosωx,1π12π,sinωxπ,cosωxπ,

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

ป้อนคำอธิบายรูปภาพที่นี่

คุณเห็นชัดเจนว่า:

  1. 1π
  2. N2

เพียงแค่ปรับสเกลพื้นฐานของฟูริเยร์ที่กำหนดโดยfdaเพื่อที่จะได้รับพื้นฐานของฟูริเยร์นำไปสู่สัมประสิทธิ์การถดถอยที่มีค่าที่คาดหวัง:

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

ป้อนคำอธิบายรูปภาพที่นี่

ลองfftตอนนี้: โปรดทราบว่าเนื่องจากYperเป็นลำดับตามลำดับจุดสุดท้ายจึงไม่เพิ่มข้อมูลใด ๆ (DFT ของลำดับนั้นเป็นคาบเสมอ) ดังนั้นเราสามารถละทิ้งจุดสุดท้ายเมื่อคำนวณ FFT นอกจากนี้ FFT เป็นเพียงขั้นตอนวิธีการคำนวณที่รวดเร็วในการคำนวณ DFT และผิวเผินลำดับของจำนวนจริงหรือซับซ้อนมีความซับซ้อน ดังนั้นเราต้องการโมดูลัสของค่าสัมประสิทธิ์ FFT:

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

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

ป้อนคำอธิบายรูปภาพที่นี่

expniωxixnexpniωxxnansin(nωx)+bncos(nωx)expix=cosx+isinx|xn|=an2+bn25=33+42


1
ขอบคุณ DeltaIV ข้อมูลdailyมาพร้อมกับfdaแพ็คเกจ
qoheleth

@ qoheleth ฉันไม่รู้ เย็นนี้ฉันจะแก้ไขคำตอบของฉันโดยใช้ชุดข้อมูลของคุณและฉันจะชี้แจงจุดสองสาม
DeltaIV
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.