1

R での時系列の階層的なグループ化について質問があります。現在、次のマトリックスがあります。

           A      B     C      F     G      H      I
[1,] -33.697  8.610 42.31 17.465 24.84 14.210 10.632
[2,]  -4.698 15.993 20.69  6.222 14.47  3.423 11.047
[3,] -37.458  9.687 47.14 14.659 32.49 12.759 19.726
[4,] -23.851 16.517 40.37 14.392 25.98  9.438 16.538
[5,]   3.329 15.629 12.30  3.449  8.85  2.635  6.215
[6,] -38.071  5.746 43.82 15.932 27.89 14.113 13.772

調べるだけで、次のことがわかります。

  • G = H + 私
  • C = F + G
  • A = B - C

Rの大規模な時系列でこれらの合計関係(正と負)を自動的に見つける方法はありますか? 関係を把握するために lm() を使用しようとしましたが、すべてのシリーズで行うには時間がかかりすぎます。多くの場合、共線性の問題があることは言うまでもありません。

どうもありがとう!

structure(list(A = c(-33.6970557915047, -4.69841752527282, -37.457728596637, 
-23.8508993089199, 3.32904924079776, -38.0712462896481), B = c(8.60984595282935, 
15.9929901333526, 9.68719404516742, 16.5167794595473, 15.6285679822322, 
5.74573907931335), C = c(42.306901744334, 20.6914076586254, 47.1449226418044, 
40.3676787684672, 12.2995187414344, 43.8169853689615), F = c(17.4649945173878, 
6.22195235290565, 14.6593122615013, 14.3921482057776, 3.44929573708214, 
15.9315551938489), G = c(24.8419072269462, 14.4694553057197, 
32.4856103803031, 25.9755305626895, 8.8502230043523, 27.8854301751126
), H = c(14.2098777298816, 3.42268325854093, 12.7592747195158, 
9.43778987810947, 2.63517117220908, 14.1129822209477), I = c(10.6320294970647, 
11.0467720471788, 19.7263356607873, 16.5377406845801, 6.21505183214322, 
13.7724479541648)), .Names = c("A", "B", "C", "F", "G", "H", 
"I"), row.names = c(NA, -6L), class = "data.frame")
4

3 に答える 3

2

これも回帰を使用しますが、

  • lm.fitよりも速いものを使用しlmます。(rcppArmadillo と rcppEigen にも存在fastLm し、同様に試すことができます。)

  • 一意の組み合わせのみを使用して、回帰の重複を回避します。

  • トリプルのみを調査する必要があると仮定して、計算量を削減します (投稿ではそうであるように思われるため)

  • 出力をクリーンアップするために、すべての係数が整数であると仮定します

コードは次のとおりです。

eps <- .1
combos <- combn(ncol(DF), 3)
for(j in 1:ncol(combos)) {
    ix <- combos[, j]
    fit <- lm.fit(as.matrix(DF[ix[-1]]), DF[[ix[1]]])
    SSE <- sum(resid(fit)^2)
    if (SSE < eps) {
        ecoef <- round(c(-1, coef(fit)))
        names(ecoef)[1] <- names(DF)[ix[1]]
        print(ecoef)
    }
}

これにより、投稿のデータでこれが得られます。

 A  B  C 
-1  1 -1 
 C  F  G 
-1  1  1 
 G  H  I 
-1  1  1 
于 2013-08-29T13:25:53.433 に答える
0

You can find linear dependence relations with MASS::Null. They are equivalent to, but not as sparse as those you found by visual inspection.

library(MASS)
Null(t(d)) # One relation per column
#             [,1]        [,2]        [,3]
# [1,]  0.41403998 -0.04178588  0.45582586
# [2,] -0.41403998  0.04178588 -0.45582586
# [3,] -0.02626794 -0.52439443  0.49812649
# [4,]  0.44030792  0.48260856 -0.04230063
# [5,]  0.62687195 -0.01159430 -0.36153375
# [6,] -0.18656403  0.49420285  0.31923312
# [7,] -0.18656403  0.49420285  0.31923312
as.matrix(d) %*% Null(t(d))  # zero
于 2013-08-29T11:46:17.987 に答える
0

階層的クラスタリング手法を試すことができます。これで正確な関係と係数が得られるわけではありませんが、テストする必要がある関係についてのアイデアを得ることができます。まず、データを準備します。

a<-rbind(c(-33.697,8.610,42.31, 17.465, 24.84, 14.210, 10.632), 
  c(-4.698,15.993,20.69,6.222, 14.47,3.423, 11.047),
  c(-37.458,9.687, 47.14, 14.659, 32.49, 12.759, 19.726),
  c(-23.851,16.517,40.37,14.392,25.98,9.438,16.538),
  c(3.329,15.629,12.30,3.449,8.85,2.635,6.215),
  c(-38.071,5.746,43.82,15.932,27.89,14.113,13.772))
colnames(a)<-c("A", "B", "C", "F", "G", "H", "I")

次に、変数間の相関を計算し、クラスター化する距離を作成します。

dd <- as.dist((1 - cor(a))/2)
plot(hclust(dd))

これにより、異なる時系列間の関係についてのアイデアが得られるはずです。結果のプロットを以下に示します。

クラスター樹状図のプロット

于 2013-08-29T11:18:08.353 に答える