No.06580 データ間でのタイムラグの計算  【MFF】 2008/05/19(Mon) 15:13

何年かぶりに書き込みさせていただきます。宜しくお願い致します。

現在,周期的な温度変化をしつつ熱を発する熱源Aと,そこから少し離れたところに置いた温度計B,さらに離れた所にある温度計Cの温度を記録した時系列データについて,A,B,Cの間での温度変化のタイムラグを計算しようとしています。
時 系列データの解析については全く知識がないため,Aに遅れて変化するBとCをそれぞれ少しずつ時間方向に動かしながらAとの相関係数を計算し,もっとも相 関係数が高かったときのAとの時間のずれを,Aの温度変化に対するB,Cそれぞれの反応のズレというようにして求めています。

このような方法がズレを求めるのに妥当な方法であるのか,それとももっと統計的に妥当な違った方法があるのか,お教えくださいませんでしょうか。インターネットなどで手法を検索するにしても,効率的に調べるためのキーワードもわからず苦慮しております。

No.06581 Re: データ間でのタイムラグの計算  【takahashi】 2008/05/19(Mon) 16:03

それは,「相互相関」と言われるものです。
多変量時系列解析の出発点としては,妥当な手法だと思います。

No.06582 Re: データ間でのタイムラグの計算  【MFF】 2008/05/19(Mon) 16:39

>takahashi様

早速のコメントありがとうございます。
相互相関というキーワードで検索をしてみましたところ,通常の相関係数とは異なるという内容を見つけましたしかし,その違いについての情報を見つけられませんでした。自己相関係数というものはたくさん出てきたのですが・・・。

>皆様

できればRで相互相関係数の計算やズレの計算ができるといいな,などと考えているのですが,どこかにサンプルとなるスクリプトや情報がありませんでしょうか。

No.06583 Re: データ間でのタイムラグの計算  【takahashi】 2008/05/19(Mon) 16:57

自己相関は自分自身との相互相関です。っていっても何のことか分からないような気もしますが。

Rで
>example(ccf)
としてグラフを眺めてみることをお勧めします。

No.06584 Re: データ間でのタイムラグの計算  【MFF】 2008/05/19(Mon) 18:07

>takahashi様

ありがとうございます。早速example(ccf)を見てみまし た。が,やっぱりわからず,実際にccfについてのスクリプトをのせているサイトを探してみているうちに,雰囲気だけはわかりました。ccfを使うと私が 最初に手動で行っていた,時間をずらしながら相関計数(ccfというのが教えていただいた相互相関係数,とうことでよろしいでしょうか?)を計算するとい う作業を自動で行ってくれて,lagに対するccfプロットまでしてくれるのですね。
あまりに便利で驚きました。

ただ,結果が表 示されても私が知りたいタイムラグが数値で表示されません。summaryを出力しても,それらしいものが見当たりません。グラフから最もccfが高くな るlagを目視で読むか,それとも結果のテーブルに出てくるccfの一覧から最も高いものを見つけて,その時のlagを見る,という方法しかないのでしょ うか?
もしもこの値を簡単に数値で出力する方法がありましたらお教えくださいませんか?

もしかするとこれはRの一般的な操作方法なのかもしれませんが,どうか宜しくお願い致します。

また,通常の相関分析のように有意な相関であるかどうかの結果を出力することはできますでしょうか。

No.06586 Re: データ間でのタイムラグの計算  【青木繁伸】 2008/05/19(Mon) 19:56

昇順に並べて lag を周期の割合で表すのではなくて,何個ずらしたかで表示したいと言うことでしょうか?それならば,以下のような短いラッパーを書くとよいでしょう。
prog <- function(x, y)
{
ans <- ccf(x, y, plot=FALSE)
o <- order(ans$acf)
cbind(ans$lag[o]*frequency(x), ans$lag[o], ans$acf[o])
}
これを使って実行。(3列目が ccf,2列目は ccf が返す lag)
> prog(mdeaths, fdeaths)
[,1] [,2] [,3]
[1,] 6 0.50000000 -0.688538519
[2,] -6 -0.50000000 -0.677803477
[3,] 5 0.41666667 -0.622386979
[4,] -7 -0.58333333 -0.611793479
途中省略
[27,] -12 -1.00000000 0.708206289
[28,] 12 1.00000000 0.721397236
[29,] 1 0.08333333 0.735668532
[30,] -1 -0.08333333 0.744309322
[31,] 0 0.00000000 0.976241251

No.06587 Re: データ間でのタイムラグの計算  【MFF】 2008/05/19(Mon) 23:45

>青木先生

お返事ありがとうございます。
私の書き方が曖昧でした。申し訳ありません。

私 が数値として出力したいのは,最もccfが高いときのlagです。今のところccf()の結果として表示されるグラフからccfが一番大きい時のlagを 読み取っているのですが,解析したいデータセットが多く,グラフから読まずにccf最大となる時のlagだけを取り出して表示させたいということです。

結果をエクセルに取り込むなどして並べ替えなどすればだせることなのですが,もしもそういった楽ができるならと思い,質問いたしました。

ところで,青木先生が
>lag を周期の割合で表すのではなくて,何個ずらしたかで表示したいと言うことでしょうか?
と 書いておられて気になったのですが,通常のccf()の結果として出てくるlagはデータを何個分ずらしたか,ということを表しているのではないのです か?わからないままに,勝手に何個ずらしたか,という意味だと思い込んでいました。つまり,たとえば表示されたlagが1で,実際のデータが10分間隔の ものであるとすれば,ズレは10分であるというように理解しておりました。

No.06588 Re: データ間でのタイムラグの計算  【takahashi】 2008/05/20(Tue) 01:04

ans$lag[which.max(ans$acf)]
で多分ダイジョブです。

lagは,ccfに渡すデータが時系列データ(いわゆるtsクラス)の場合,時間となりますし,そうでなければ,データのズレの個数となります(というか1Hzという解釈かな)。

ans<-ccf(c(mdeaths), c(fdeaths))

とか。

No.06589 Re: データ間でのタイムラグの計算  【青木繁伸】 2008/05/20(Tue) 08:01

> 私が数値として出力したいのは,最もccfが高いときのlagです

一番高いものだけでよいのかなあと思ったので,ソートしてみました。1列目が lag ですよ。

No.06590 Re: データ間でのタイムラグの計算  【MFF】 2008/05/20(Tue) 09:41

>takahashi様,青木先生

お二人とも本当にありがとうございます。

R自体も初心者で,お二人が書いておられるmdeathsやfmdeathsがいったい何なのか悩んでしまいました(^^;。しかし,おかげさまでccfの値での並べ替えも,直接ccf最大となるlagを書き出す方法も,両方理解することができました。
これで,最初に解析したかった,熱源Aの温度変化に対するBとCの応答の時間的ズレ(ccf最大となるlag)を求めることができます!ありがとうございます!

最後にもう一点教えていただきたいのですが,求めた相互相関が有意な相関であるのかどうかをP値のようにして表示することはできますでしょうか。

● 「統計学関連なんでもあり」の過去ログ--- 041 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る