今回から,本格的に2次自己回帰過程のパワースペクトルに入ります.自己回帰過程の理解において,最も重要なポイントの一つは
「n次自己回帰過程のパワースペクトルは,1次自己回帰過程と2次自己回帰過程のパワースペクトルの和になっている」
ということです (ほとんどの教科書には書いてありませんが,というか,書いてある教科書を私は知りません).ですので,1次と2次自己回帰過程について理解すれば,自己回帰過程を完全にマスターした気分に近づけると思います.
今回は,前回紹介した,以下のテクニックを使います.
chaos-kiyono.hatenablog.com
2次自己回帰過程のパワースペクトル
それでは,2次自己回帰過程
を考えます.ここで,,
は実数のパラメタ,
は平均0,分散
の白色ノイズです(以前はwとしたのを,xにしました).
のフーリエ変換を,
,パワースペクトルの推定量を
とします.
についても,それぞれ,
,
とします.そして,
です (これは真のパワースペクトルですが).Nを時系列の長さとすれば,
です.上の式の両辺をフーリエ変換して,両辺の絶対値をとって2乗して,Nで割ると以下のようになります.
複素数の絶対値の2乗が,であることに注意して,オイラーの公式
を使えば,2次自己回帰過程のパワースペクトル
がえられます.ここから,このパワースペクトルの性質を考えていきます.

パワースペクトルが1次自己回帰過程のパワースペクトルの和になる場合
2次自己回帰過程のパワースペクトルには,振動に対応するピークがあると思い込んでいませんか.違うときもあります.
(注意:
ここでは,
の分母に注目します.の部分を
で置き換えた式
が実数の範囲で因数分解できて,
とできるとします.が仮定されています (重解はやりません).
と
は,
の解で
,
です.このとき,上のの式は,
と
を使って,
となります (計算間違いや,打ち間違いがあればすいません).つまり,以下のような形になり,2つの1次自己回帰過程のパワースペクトルの足し算になってます (下図参照).

パワースペクトルが振動のピークを持つ場合
上の条件と違うとき,つまり,
このとき,なので,
はマイナスの値です.
ここでは,最初に導いた2次自己回帰過程のパワースペクトル,
を使います.の領域で,パワースペクトルが振動に対応するピークを持つということは,
の分母が下に凸なグラフになり,最小値を一つ持ちます (小さい値で割ると,値が大きいということだぞ).ということで,
がマイナスであることに注意して,分母のcosを含む部分の最小値を評価すると (
の2次関数なので平方完成),
となり,最小値(頂点)になるは,
ということで,ピーク周波数は,
です.英語のWikipediaには,結果のみ示してあります.
en.wikipedia.org
学生が,記事の更新が早すぎると不平を言いますが,理解してほしい内容にたどり着くまでには,このペースでも,1ヶ月くらいはかかるかもしれません.
おまけ
グラフを書くのに使用したRスクリプト.
ピークがある場合.
# 2次自己回帰仮定のパワースペクトル f.ar2 <- function(x,a,b){ return(1/(1+a^2+b^2-2*a*(1-b)*cos(2*pi*x)-2*b*cos(4*pi*x))) } f.ar11 <- function(x,a,b){ return(a^2*b^3/(a^2*b-a*b^2-a+b)/(1+b^2-2*b*cos(2*pi*x))) } f.ar12 <- function(x,a,b){ return(-a^3*b^2/(a^2*b-a*b^2-a+b)/(1+a^2-2*a*cos(2*pi*x))) } a1 <- 0.9*sqrt(3) a2 <- -0.81 lambda1 <- (-a1+sqrt(a1^2+4*a2))/(2*a2) lambda2 <- (-a1-sqrt(a1^2+4*a2))/(2*a2) # グラフを描いてみる par(mfrow=c(1,2),cex.axis=1.2,cex.lab=1.5) curve(f.ar2(x,a1,a2),xlim=c(0,1/2),n=1000,ylab="S(f)",xlab="f",col=2,lwd=2,las=1,xaxs="i") if(a1^2+4*a2 < 0) abline(v=acos(a1*(a2-1)/(4*a2))/(2*pi),col=8,lty=2) # 両対数目盛 curve(f.ar2(x,a1,a2),xlim=c(0.01,1/2),log="xy",n=1000,ylab="S(f)",xlab="f",col=2,lwd=2,xaxt="n",yaxt="n",xaxs="i") if(a1^2+4*a2 < 0) abline(v=acos(a1*(a2-1)/(4*a2))/(2*pi),col=8,lty=2) # 対数目盛を描く axis(1,at=10^(-5:5)%x%(1:9),label=FALSE,tck=-0.02) tmp<-paste(paste(sep="","expression(10^",-5:5,")"),collapse=",") v.label<-paste("axis(1,las=1,at=10^(-5:5),label=c(",tmp,"),tck=-0.03)",sep="") eval(parse(text=v.label)) axis(2,at=10^(-5:5)%x%(1:9),label=FALSE,tck=-0.02) tmp<-paste(paste(sep="","expression(10^",-5:5,")"),collapse=",") v.label<-paste("axis(2,las=1,at=10^(-5:5),label=c(",tmp,"),tck=-0.03)",sep="") eval(parse(text=v.label)) ####################
1次自己回帰過程の重ね合わせになる場合.
# 2次自己回帰仮定のパワースペクトル f.ar2 <- function(x,a,b){ return(1/(1+a^2+b^2-2*a*(1-b)*cos(2*pi*x)-2*b*cos(4*pi*x))) } f.ar11 <- function(x,a,b){ return(a^2*b^3/(a^2*b-a*b^2-a+b)/(1+b^2-2*b*cos(2*pi*x))) } f.ar12 <- function(x,a,b){ return(-a^3*b^2/(a^2*b-a*b^2-a+b)/(1+a^2-2*a*cos(2*pi*x))) } a1 <- 0.9 a2 <- 0.7 lambda1 <- (-a1+sqrt(a1^2+4*a2))/(2*a2) lambda2 <- (-a1-sqrt(a1^2+4*a2))/(2*a2) # グラフを描いてみる par(mfrow=c(1,2),cex.axis=1.2,cex.lab=1.5) curve(f.ar2(x,a1,a2),xlim=c(0,1/2),n=1000,ylab="S(f)",xlab="f",col=2,lwd=2,las=1,xaxs="i",ylim=c(0,3),yaxs="i") curve(f.ar11(x,lambda1,lambda2),xlim=c(0,1/2),add=TRUE,n=1000,col=4,lwd=2,lty=2) curve(f.ar12(x,lambda1,lambda2),xlim=c(0,1/2),add=TRUE,n=1000,col=3,lwd=2,lty=2) if(a1^2+4*a2 < 0) abline(v=acos(a1*(a2-1)/(4*a2))/(2*pi),col=8,lty=2) # 両対数目盛 curve(f.ar2(x,a1,a2),xlim=c(0.01,1/2),log="xy",n=1000,ylab="S(f)",xlab="f",col=2,lwd=2,xaxt="n",yaxt="n",xaxs="i",ylim=c(0.01,3)) if(a1^2+4*a2 < 0) abline(v=acos(a1*(a2-1)/(4*a2))/(2*pi),col=8,lty=2) curve(f.ar11(x,lambda1,lambda2),xlim=c(0.01,1/2),add=TRUE,n=1000,col=4,lwd=2,lty=2) curve(f.ar12(x,lambda1,lambda2),xlim=c(0.01,1/2),add=TRUE,n=1000,col=3,lwd=2,lty=2) # 対数目盛を描く axis(1,at=10^(-5:5)%x%(1:9),label=FALSE,tck=-0.02) tmp<-paste(paste(sep="","expression(10^",-5:5,")"),collapse=",") v.label<-paste("axis(1,las=1,at=10^(-5:5),label=c(",tmp,"),tck=-0.03)",sep="") eval(parse(text=v.label)) axis(2,at=10^(-5:5)%x%(1:9),label=FALSE,tck=-0.02) tmp<-paste(paste(sep="","expression(10^",-5:5,")"),collapse=",") v.label<-paste("axis(2,las=1,at=10^(-5:5),label=c(",tmp,"),tck=-0.03)",sep="") eval(parse(text=v.label)) ####################