[英]Time-series hierarchy/grouping in R
我對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
僅通過檢查,我就能發現:
有沒有一種方法可以在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")
這也使用回歸,但是
使用比lm
快的lm.fit
。 (您也可以嘗試在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
您可以嘗試分層聚類方法。 這不會為您提供確切的關系和系數,但是可以使您對應該測試的關系有所了解。 首先,我們准備您的數據。
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))
這應該使您了解不同時間序列之間的關系。 結果圖如下所示。
您可以使用MASS::Null
找到線性相關關系。 它們與通過肉眼檢查發現的那些等效但不稀疏。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.