2016-05-19 10 views
1

グループ化変数でグループ化された時系列のACFを計算したいと思います。具体的には、私は、単一の時系列(変数a)およびグループ化変数(例えば、平日、変数b)を含むデータフレームを有する。次に例を示します。ACF in group in R

data <- data.frame(a=rnorm(1:150), b=rep(rep(1:3, each=5), 10)) 

今、私は、グループ化変数の異なる値のためのACFを計算したいと思います。例えば、ラグ2とグループ1については、b = 1(t-2のbの値は関係ありません)の時点tでのみ計算されたtとt-2の間の相関関係を取得したいと考えています。私は関数acfは簡単にACFを計算することができますが、私はグループ化変数を含める方法を見つけることはできません知っている。

私は手動で希望の相関を計算することができましたが、大きなデータセットとグルーピング変数のラグと値が多いため、よりエレガントで高速な方法があることを願っています。

sel <- which(data$b==1) 
cor(data$a[sel[sel > 2]], data$a[sel[sel>2] - 2]) 

答えて

0

あなたが各グループにあなたの関数を適用するためにバケツであなたのdata.frameを区切るし、その後lapplyするsplitを見て持つことができます。ここで(ラグ2、B = 1)上記の例のための手計算であります。グループの場合

groups_data <- split(data, data$b) 
groups_acf <- lapply(groups_data, acf,...) 

次にあなたが `sapply(グループ、ACF、FUN =機能(acfobject){acfobjectの$値})とインスタンスの出力リストから必要な情報を抽出する必要が

:ような何か計算、私はまた、新しい方法 "ラ"ハドレーウィッカムと%>%オペレータとgroup_byとdefinitely行くだろう。私のToDoリスト上で勉強...

+0

これは望ましい結果をもたらさないと思います。私がデータを分割すると、遅れはもはや正しくありません。例えば、b = 1の第2のグループの第1の観測の遅れ1の観測は、b = 1の第1のグループの最後の観測であるが、b = 3の第1のグループの最後の観測となる。 – Lila

+0

ああ... OK。 「t-2のbの価値は問題ではない...」 –

0

I誰もが、私は今、手計算のために選んだ興味を持っている:私はその後、遅れ2、およびb = 1のために必要な値を計算するための関数を使用し

getacfgroup <- function(ts, lag, groupvar, group) { 
    sel <- which(groupvar == group) 
    cor(ts[sel[sel > lag]], ts[sel[sel>lag] - lag]) 
} 

次のように:

getacfgroup(data$a, 2, data$b, 1) 

すべての遅れの値を取得するために、私はちょうどsapply呼び出しで、別のlapplyコールのすべてのラグやグループのためにすべてを包みました。

編集:誰かがより洗練されたソリューションを持っていれば、私はまだ興味があります。

+0

ええ、私は「サプリー(....)」とあなたの機能のようなことをやろうとしていました。私はあなたのケースで 'group_by'を使うことができないので、他の方法については気づいていません。 – Sotos

+0

あなたの答えはどうもありがとう!それも私が思ったことですが、私は他の誰かがより良い考えを持っていることを望みました – Lila

0

私はあなたが探している情報を正確に理解していませんが、複数のグループのacf値が必要な場合は、これを達成する必要があります。一部の人々はtidyソリューションの作成について言及しており、グループ化された計算にはdplyr,tidyrpurrrを使用しています。

library(dplyr) 
library(tidyr) 
library(purrr) 

sample_data <- dplyr::data_frame(group = sample(c("a", "b", "c"), size = 100, replace = T), value = sample.int(30, size = 100, replace = T)) 
head(sample_data) 
#> # A tibble: 6 × 2 
#> group value 
#> <chr> <int> 
#> 1  c 28 
#> 2  c  9 
#> 3  c 13 
#> 4  c 11 
#> 5  a  9 
#> 6  c  9 

grouped_acf_values <- sample_data %>% 
    tidyr::nest(-group) %>% 
    dplyr::mutate(acf_results = purrr::map(data, ~ acf(.x$value, plot = F)), 
     acf_values = purrr::map(acf_results, ~ drop(.x$acf))) %>% 
    tidyr::unnest(acf_values) %>% 
    dplyr::group_by(group) %>% 
    dplyr::mutate(lag = seq(0, n() - 1)) 

head(grouped_acf_values) 
#> Source: local data frame [6 x 3] 
#> Groups: group [1] 
#> 
#> group acf_values lag 
#> <chr>  <dbl> <int> 
#> 1  c 1.00000000  0 
#> 2  c -0.20192774  1 
#> 3  c 0.07191805  2 
#> 4  c -0.18440489  3 
#> 5  c -0.31817935  4 
#> 6  c 0.06368096  5