从统计角度看:傅立叶变换与基于傅立叶基础的回归


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基础,而用于回归的一般“傅立叶基础”可以使用任意频率比(例如,至少在连续算术中包括无理数)。可能也很有趣。
GeoMatt22 2016年

我认为如果您用数学术语(而不是代码片段)来编写问题,那么每个人都会从中受益。您解决的回归问题是什么?您使用的傅立叶基础函数是什么?您会对问题的答案将如何改善感到惊讶。
Yair Daon

Answers:


15

他们是一样的。就是这样...

进行回归

说你拟合模型 其中= 1 ... ÑÑ = 地板ñ / 2 。不过,这不适用于线性回归,因此您可以使用一些三角函数(cos a + b = cos

yt=j=1nAjcos(2πt[j/N]+ϕj)
t=1,,Nn=floor(N/2))和适合的等效模型: Ŷ = Ñ Σ Ĵ = 1 β 1 Ĵ COS 2 π [ Ĵ / Ñ ] + β 2 Ĵ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]).
上所有的傅立叶频率的运行线性回归给你一堆(2 Ñ贝塔):{ βĴ }= 1 2。对于任何j,如果要手动计算对,则可以使用:{j/N:j=1,,n}2n{β^i,j}i=1,2j

β 2Ĵ=Σ Ñ = 1个 Ÿ2π[Ĵ/Ñ]

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

在此处输入图片说明

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的快速数值算法,实数或复数序列的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 '17年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.