r - 使用 R 中的 hclust 为时间序列数据的每个观察值分配簇号

标签 r dplyr time-series hierarchical-clustering

我有一个时间序列数据,其中包含大约 5 年的 4 个变量。我想使用 hclust 对数据进行聚类R中的方法。我想对观察进行聚类。我的代码有效。但是,我想为每个观察确定特定的集群。也就是说,我想在每个观察旁边添加集群的数量。我的代码给了我一个错误。我理解错误。那么有什么方法可以实现我的观点。
这是我的尝试:

library(TSclust)
library(cluster)    # clustering algorithms
library(tseries)
library(zoo)
library(dtw)
library(dtwclust)
library(dplyr)
##Load the data
data("EuStockMarkets")
##Save the data
dat <- EuStockMarkets

res <- lapply(split(as.zoo(EuStockMarkets), as.integer(time(EuStockMarkets))), as.ts)
## Re-define the data
datNew <- ts(rbind(res$`1995`,res$`1996`,res$`1997`, res$`1998`))
d <- dist(datNew, method = "DTW")
hc1 <- hclust(d, method = "average" )
sub_grp <- cutree(hc1, k = 4)
table(sub_grp)
datNew%>%
  mutate(cluster = sub_grp) %>%
  head
它返回一个错误:
 Error in UseMethod("mutate_") : 
 no applicable method for 'mutate_' applied to an object of class "c('mts', 'ts', 'matrix')"

In addition: Warning message:
`mutate_()` is deprecated as of dplyr 0.7.0.
Please use `mutate()` instead.
See vignette('programming') for more help

最佳答案

我想问题是你的 datNew不是 data.frame .看着:

class(datNew)
[1] "mts"    "ts"     "matrix"
这给了你你的错误。如果你把它写成 data.frame :
library(dplyr)
data.frame(timeseries=as.matrix(datNew), date=time(datNew))%>%
           # use mutate() instead of mutate_()
           mutate(cluster = sub_grp) %>%
           head()
它应该有效,希望这是您需要的结果。
  timeseries.DAX timeseries.SMI timeseries.CAC timeseries.FTSE date cluster
1        2110.77         2673.5         1956.0          3083.4    1       1
2        2097.34         2656.2         1927.8          3095.8    2       1
3        2074.68         2628.8         1894.2          3065.6    3       1
4        2097.51         2628.8         1881.2          3065.5    4       1
5        2079.19         2628.8         1881.2          3065.5    5       1
6        2068.92         2612.3         1885.9          3065.7    6       1
编辑
如果需要,您可以在 log 和 dif 之后使用 hclust 尝试此操作:
res <- lapply(split(as.zoo(EuStockMarkets), as.integer(time(EuStockMarkets))), as.ts)
datNew <- ts(rbind(res$`1995`,res$`1996`,res$`1997`, res$`1998`))

dat.log <- log(datNew)
dat.diff <- diff(dat.log)
Logreturns <- dat.diff

# using a different dist, due an error, the idea is the same
d <- dist(Logreturns)

hc1 <- hclust(d, method = "average" )
sub_grp <- cutree(hc1, k = 4)


data.frame(timeseries=as.matrix(Logreturns), date=time(Logreturns))%>%
  mutate(cluster = sub_grp) %>% 
  head()

关于r - 使用 R 中的 hclust 为时间序列数据的每个观察值分配簇号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63720977/

相关文章:

R:按值选择行并始终包含上一行

regex - 从字符串中提取第一个数字

r - R 中 data.frame 内的矩阵或其他嵌套结构

按两列排名并保持联系

python - 使用验证窗口向前走,用于时间序列数据交叉验证

r - 在 R 中向 TableGrob 添加标题

将长数据框 reshape 为宽数据框并使用一列作为前缀重命名新列

r - 对出现次数少于 3 次的值进行匿名处理?

python - 使用 Dask DataFrame 计算前向差异?

python - 如何将 pandas DataFrame 转换为 TimeSeries?