2

次のパネル データには、他の人より多くの観察結果を持つ個人がいます。

id <- c("John","John","John","John","John",
        "Mike","Mike","Mike","Mike", 
        "Andrea","Andrea","Andrea","Andrea","Andrea","Andrea","Andrea")
time <- c(1:5, 1:4, 1:7)
observation <- c(rnorm(1:5), rnorm(1:4), rnorm(1:7))

paneldata <- data.frame(id, time, observation)

個人間の観測値の相関を計算したいと思います。R は欠落している観測を無視する必要があります。

Mike と John の相関: 時間 1 ~ 4 のみを考慮する必要があります

John と Andrea の相関関係: 時間 1 から 5 のみなど

これらの結果を達成するための最良の方法は何ですか?

4

1 に答える 1

3

データセットをワイドフォーマットに広げてから、データセットcor全体を( を削除しながら)実行し、関数内timeで指定して、相対的な観測のみを比較することをお勧めします。また、ランダム データ セットを作成するときにa を使用することをお勧めします。これらの結果は一致します"pairwise.complete.obs"corset.seedset.seed(123)

library(dplyr)
library(tidyr)
paneldata %>%
  spread(id, observation) %>%
  select(-time) %>%
  cor(., use = "pairwise.complete.obs")
#            Andrea       John       Mike
# Andrea  1.0000000  0.1288513 -0.3770482
# John    0.1288513  1.0000000 -0.8471950
# Mike   -0.3770482 -0.8471950  1.0000000

を実行する前にワイド データ セットがどのように見えるかを簡単に理解できるように、データ セットcorの図を次に示します。

#      Andrea        John       Mike
# 1 -0.4456620 -0.56047565  1.7150650
# 2  1.2240818 -0.23017749  0.4609162
# 3  0.3598138  1.55870831 -1.2650612
# 4  0.4007715  0.07050839 -0.6868529
# 5  0.1106827  0.12928774         NA
# 6 -0.5558411          NA         NA
# 7  1.7869131          NA         NA

コメントで@akrunが指摘したように、同様の結果を得ることができます。これにより、列を行名に変換するため、列reshape2::acastを削除する手間も省けますtime

library(reshape2)
cor(acast(paneldata, time ~ id, value.var = 'observation'), use = 'pairwise.complete.obs')
#            Andrea       John       Mike
# Andrea  1.0000000  0.1288513 -0.3770482
# John    0.1288513  1.0000000 -0.8471950
# Mike   -0.3770482 -0.8471950  1.0000000
于 2015-08-16T09:53:12.690 に答える