2次自己回帰過程の自己共分散 (自己相関)関数を一つの式で表しておきます.差分方程式の形での表現は,この前のセミナーで学生が導いてくれたし,インターネットで検索すればいくらでも出てくると思います.
2次自己回帰過程
今回,考えるのはこれです.
ここで,,は実数のパラメタ,は平均0,分散の白色ノイズです.このとき,自己共分散 (自己相関)関数が,次のようになることを導きます.
(今回,この式を生まれてはじめて導きました.他の仕事がたくさんあるのに,この計算に時間をかけてしまいました.関係者の方すいません.)すごく基本的な式だと思いますが,間違えていると申し訳ないので,この式が載っている本や論文やホームページがあれば教えてください.導出の過程で,正負の吟味や,絶対値を付けるかなど,表現を迷ったところがあるので,間違いがあれば教えてください.
自己共分散 (自己相関)関数の差分方程式表現
多くの教科書に載っている,2次自己回帰過程の自己共分散 (自己相関)関数はこれです.
導出過程は省略します.検索すれば,丁寧に説明してあるページを見つけられると思います.
この結果を示されると,「一つの式で書けないの?」と疑問がわきます.
だって,これだと不便な感じがします.例えば,自己共分散 (自己相関)関数がどんな形なのか,一見して想像できません.
自己共分散 (自己相関)関数を一つの式で表してみる
上の差分方程式表現を使って,私が計算した結果を示します (間違っていたらすいません).漸化式を解くだけなので高校生でも解けるかというと,そんなに簡単ではありません.複素数の極形式や逆三角関数の関係式なんかを使います.
ということで,2次自己回帰過程の自己共分散 (自己相関)関数はこれです.
(は平均0,分散)
において,のとき,自己共分散 (自己相関)関数は,
ここで,
私は計算能力に自信がないので,解析的に計算してみたら,必ず数値的に検証します.Rで差分方程式を使った自己共分散 (自己相関)関数と今回導いたもののグラフを重ねると,以下のようになりました.
上図のグラフは,一番上が差分方程式表現,その下が今回導出した結果,一番下が, 差分方程式表現と今回導出した結果を重ねたグラフです.正しそうです.
導出には,3項間の漸化式の解き方を使います.私が高校生のころは,ちょっと発展的な参考書に解き方が載っていました.他は,複素数の知識も計算には必要です.
こんなのテストに出ないし,研究の論文にもならないのに,何でやっているの?と疑問に思うかもしれません.こういった計算を地道にやり,知識と感覚を養っていくことが,新しい結果をみつけて,論文を書くためには必要なのです.少なくとも私のやり方はこれです.時系列の分析に,Rとか,Pythonとかの何かよく分からない関数やパッケージを使って,なんとなくこねくりまわしてみる.そんなやり方をしている研究者もいるかもしれません.それもありだと思いますが,それだと物事を理解したときの喜びは小さいような気がします.
おまけ
グラフを描くときに使ったRスクリプト.
#################### # パラメタ (parameter) a1 <- 0.9*sqrt(3) a2 <- -0.81 # w[n]の標準偏差sig^2 sig2 <- 1 ######## # 差分方程式表現した自己共分散関数 m <- 100 acov <- c() acov[1] <- sig2/((1-a2)^2-a1^2)*(1-a2)/(1+a2) acov[2] <- a1/(1-a2)*acov[1] for(i in 3:(m+1)){ acov[i] <- a1*acov[i-1]+a2*acov[i-2] } # グラフを描く par(mfrow=c(3,1),mar=c(4,4,1,1),cex=1.3) plot(0:m,acov,"o",pch=16,col=3,lwd=2,xlab="Lag k", ylab="Autocovariance C(k)",las=1) ############################## # 導出した結果 roots <- polyroot(c(a2,a1,-1)) root <- roots[1] r <- abs(root) ImL <- Im(root) omega <- atan(ImL/Re(root)) # C(0)をC(1)は, 差分方程式表現で計算した結果を使わせてもらいます. C0 <- acov[1] C1 <- a1/(1-a2)*acov[1] ############################## # グラフを描く curve(C0*r^x*cos(omega*x)+C0*((a1+a1*a2)/((1-a2)*sqrt(-a1^2-4*a2)))*r^x*sin(omega*x),n=1000,col=2,lwd=2,xlim=c(0,m),ylab="Autocovariance C(k)",las=1) points(0:m,C0*r^(0:m)*cos(omega*(0:m))+C0*((a1+a1*a2)/((1-a2)*sqrt(-a1^2-4*a2)))*r^(0:m)*sin(omega*(0:m)),col=2) # グラフを重ねて描いてみる plot(0:m,acov,"o",pch=16,col=3,lwd=2,xlab="Lag k", ylab="Autocovariance C(k)",las=1) curve(C0*r^x*cos(omega*x)+C0*((a1+a1*a2)/((1-a2)*sqrt(-a1^2-4*a2)))*r^x*sin(omega*x),add=TRUE,n=1000,col=2,lwd=2,lty=2) points(0:m,C0*r^(0:m)*cos(omega*(0:m))+C0*((a1+a1*a2)/((1-a2)*sqrt(-a1^2-4*a2)))*r^(0:m)*sin(omega*(0:m)),col=2)