それらは強く関連しています。データを含めなかったため、あなたの例は再現できません。したがって、新しい例を作成します。まず、周期関数を作成しましょう。
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= 2 k + 1N− 2N− 3 = 2 (k − 1 )K ωN= 3k = 1N-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)
周波数は正確に正しいものですが、非ゼロ成分の振幅は(1,2,3,4)ではないことに注意してください。理由は、fda
フーリエ基底関数が奇妙な方法でスケーリングされるためです。通常のフーリエ基底ように、最大値は1ではありません。正規直交フーリエ基底の場合のように、でもありません。。1 、罪ω X、COSω X、...1π√12個のπ√、罪ω Xπ√、cosω Xπ√、…
# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)
あなたは明らかにそれを見る:
- 最大値は未満です1π√
- フーリエ基底(最初の項に切り捨てられた)には、定数関数(黒い線)、周波数が増加する正弦(領域境界で0に等しい曲線)、および周波数が増加する余弦(曲線がドメイン境界で1に等しい)、あるべきN− 2
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はcomplexです。したがって、FFT係数のモジュラスが本当に必要です。
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
フーリエ基底と同じスケーリングを得るためにを掛けます。スケーリングしなかった場合でも、正しい周波数を回復しますが、振幅はすべて、以前に見つけたものと同じ係数でスケーリングされます。次に、fft係数をプロットします。2N− 11 、罪ω 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")
Ok:周波数は正しいですが、基底関数はもはやサインとコサインではないことに注意してください(それらは複素指数で、は虚数単位を表します)。また、以前のようにゼロ以外の周波数のセット(1,2,3,4)の代わりに、セット(1,2,5)を得たことにも注意してください。その理由は、この複素係数展開の項(したがっては複素数)は、2つの実項に対応するためです。なぜならオイラー式の三角基底膨張、。複素係数のモジュラスは、2つの実係数の直交の合計に等しくなります。つまり、expnは私ω X私バツnexpnは私ω XバツnansのiがN (N ω X )+ BnC 、O 、S (N ω X )expi x =cosx +isinバツ| バツn| = a2n+ b2n−−−−−−√。実際のところ、。5 = 33+ 42−−−−−−√