統計的観点から:フーリエ変換とフーリエ基底を使用した回帰


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は複素数を返しますが、回帰は実数を返します。

彼らは同じ情報を伝えていますか?2つの数値セットの間に1対1のマップがありますか?

(答えがエンジニアの観点ではなく、統計学者の観点から書かれていれば幸いです。多くのオンライン資料には、エンジニアリングの専門用語が至る所にあり、私には好まれません。)


私はあなたのコードスニペットに精通していないので、次の問題がそこに当てはまるかどうか言うことはできません。ただし、通常、DFT基底は整数(「全数」)周波数で定義されますが、回帰の一般的な「フーリエ基底」では任意の周波数比を使用できます(たとえば、少なくとも連続演算では無理数を含みます)。これも興味深いかもしれません。
GeoMatt22 16

(コードスニペットとは対照的に)数学用語で質問を書くと誰もが恩恵を受けると思います。あなたが解決する回帰問題は何ですか?使用するフーリエ基底関数は何ですか?あなたの質問に対する答えがどのように改善されるかに驚くでしょう。
イェールダオン

回答:


15

彼らは同じです。方法は次のとおりです...

回帰を行う

モデルを近似するとします ここで、および。ただし、これは線形回帰には適していないため、代わりにいくつかの三角法()とfitを使用します等価モデル: すべてのフーリエ周波数線形回帰を実行すると、多数のベータ()のベータが得られます:、。任意の

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 j個の2 π T [ J / N ] { J / N J = 1 ... N } 2 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]).
{j/N:j=1,,n}2niは=12J{β^i,j}i=1,2j、ペアを手動で計算したい場合は、次を使用できます。

β 2J=Σ NのT = 1 YTの2πT[J/N]

β^1j=t=1Nytcos2πt[j/N]t=1Ncos22πt[j/N]
および これらは標準の回帰式です。
β^2j=t=1Nyt2πt[j/N]t=1N22π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

|dj/N|2=N1t=1Nytcos2πt[j/N]2+N1t=1Nyt2πt[j/N]2
Rでは、このベクトルの計算はになりますがI <- abs(fft(Y))^2/length(Y)、これはスケーリングする必要があるため、ちょっとおかしいです。

また、「スケーリングされたピリオドグラム」を 定義することができます 明確。Rでは、これはになります。

Pj/N=2Nt=1Nytcos2πt[j/N]2+2Nt=1Nyt2πt[j/N]2
Pj/N=4N|dj/N|2P <- (4/length(Y))*I[(1:floor(length(Y)/2))]

二人のつながり

回帰と2つのピリオドグラムとの関係は次のとおりです。

Pj/N=β^1j2+β^2j2
どうして?選択した基底は直交/直交であるためです。各に対して、。回帰係数と出来上がりの式の分母にそれを差し込みます。jt=1Ncos22πt[j/N]=t=1N22π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)

ここに画像の説明を入力してください

それでは、回帰のフーリエ基底を作成しましょう。場合、基底関数、つまり非定数正弦波と余弦波よりも多くの周波数成分を作成することは実際には意味がないことに注意してください。そのようなグリッド上でエイリアスされます。たとえば、周波数サインは、コサイン(サイン)と区別できません場合、つまりの場合を考えます。とにかく、あなたがダブルチェック、単に変更したい場合に、以下のスニペットと最後の2つの列を見て:デザイン行列は今特異であるので、あなたは、彼らが実際に無用だ(と彼らはフィット感のための問題を作成することがわかります)。N=2k+1N2N3=2k1kω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)

ここに画像の説明を入力してください

周波数は正確に正しいものですが、非ゼロ成分の振幅は(1,2,3,4)ではないことに注意してください。理由は、fdaフーリエ基底関数が奇妙な方法でスケーリングされるためです。通常のフーリエ基底ように、最大​​値は1ではありません。正規直交フーリエ基底の場合のように、でもありません。。1ωバツcosωバツ1π12πωバツπcosωバツπ

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

ここに画像の説明を入力してください

あなたは明らかにそれを見る:

  1. 最大値は未満です1π
  2. フーリエ基底(最初の項に切り捨てられた)には、定数関数(黒い線)、周波数が増加する正弦(領域境界で0に等しい曲線)、および周波数が増加する余弦(曲線がドメイン境界で1に等しい)、あるべき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")

ここに画像の説明を入力してください

試してみましょうfftYper周期的なシーケンスなので、最後のポイントは実際には情報を追加しません(シーケンスのDFTは常に周期的です)。したがって、FFTの計算時に最後のポイントを破棄できます。また、FFTはDFTを計算するための高速な数値アルゴリズムであり、実数または複素数のシーケンスのDFTはcomplexです。したがって、FFT係数のモジュラスが本当に必要です。

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

フーリエ基底と同じスケーリングを得るためにを掛けます。スケーリングしなかった場合でも、正しい周波数を回復しますが、振幅はすべて、以前に見つけたものと同じ係数でスケーリングされます。次に、fft係数をプロットします。2N11ωバツcosωバツ

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

ここに画像の説明を入力してください

Ok:周波数は正しいですが、基底関数はもはやサインとコサインではないことに注意してください(それらは複素指数で、は虚数単位を表します)。また、以前のようにゼロ以外の周波数のセット(1,2,3,4)の代わりに、セット(1,2,5)を得たことにも注意してください。その理由は、この複素係数展開の項(したがっては複素数)は、2つの実項に対応するためです。なぜならオイラー式の三角基底膨張、。複素係数のモジュラスは、2つの実係数の直交の合計に等しくなります。つまり、expnωバツバツnexpnωバツバツnansnnωバツ+bncosnωバツexpバツ=cosバツ+バツ|バツn|=an2+bn2。実際のところ、。5=33+42


1
DeltaIVのおかげで、データdailyfdaパッケージに付属しています。
-qoheleth

@qoheleth知らなかった。今晩、データセットを使用して回答を修正し、いくつかのポイントを明確にします。
-DeltaIV
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.