我有10个变量,有10个单独的状态(十分位数),我正在尝试创建一个2D马尔可夫过渡矩阵。这将意味着10 ^ 10行和10 ^ 10列的矩阵,这将是非常稀疏的。这太大了,不能使用,但我希望有一种方法来处理稀疏矩阵,特别是稀疏转换矩阵。
如果您不熟悉,转换矩阵提供了在下一个时间步骤中从一个“状态”移动到另一个“状态”的概率。由于我有很多变量,我必须从10D空间到2D进行投影(如果你愿意)。例如,如果我有2个变量,每个变量都是正数或负数,我会得到2 ^ 2 = 4个状态,++, - ,+ - , - +,这些变量就是行和列。值将是从行状态移动到列状态的一些概率。可能无法从一个状态转到另一个状态,在矩阵的该位置产生零。这产生如下内容:
[+,+] [+,-] [-,-] [-,+]
[+,+] 0.5500000 0.3500000 0.1000000 0.0000000
[+,-] 0.0000000 0.5500000 0.4500000 0.0000000
[-,-] 0.0000000 0.2500000 0.0000000 0.7500000
[-,+] 1.0000000 0.0000000 0.0000000 0.0000000
正如你可以推断的那样,得到的矩阵可能(并且可能是)非常稀疏,创建了一个巨大的矩阵,只有某些区域实际上产生了有用的信息。
我目前正在使用'markovchain'软件包从数据中生成经验转换矩阵。 (这是一个非常简化,更小的测试版本,只使用3个变量,每个变量有3个独立状态。)如果我试图创建一个太大的矩阵,它会产生一个错误,这将有许多“空”区域。是否有一个更好的包,其中包含对非常大,非常稀疏的矩阵的支持?
这是我正在使用的函数,如果它可以产生大的稀疏矩阵:
theP <- markovchainFit(data = gdxReturnsUD)$estimate@transitionMatrix
感谢!!!
答案 0 :(得分:0)
我还没完全明白你的问题。但是,根据我的猜测,我可能会使用动态贝叶斯网络来展示您的模型。从数据结构的角度来看,您需要一个更加压缩的数据结构,而不是二维矩阵。 你可以谷歌&#34;概率图形模型&#34;获得更多想法。
答案 1 :(得分:0)
你将很难使用这种大型矩阵,无论你使用哪种方法。这不是你可以用一台简单的笔记本电脑做的动作......你需要一台拥有极大RAM的机器的野兽。 或者设置一个计算机集群来完成繁重的工作(通过划分任务这应该是可能的)
一旦掌握了这样的机器,就需要手动创建矩阵。首先创建一个带有所需维度的空矩阵,然后使用一组表函数逐步填充它。
类似的东西:
##create empty matrix
dummymarkov<-matrix(nrow = 10^10, ncol = 10^10)
colnames(dummymarkov)<-unique(train$states)
rownames(dummymarkov)<-unique(train_ver2$code)
##subset your data
temp<-train[x:y]
## table the subset
tmp_table<-table(tmp$state[1:(nrow(tmp)-1)], tmp$state[2:nrow(tmp)])
## feed the larger matrix
dummymarkov[rownames(tmp_table)[1],colnames(tmp_table)[1]]<-tmp_table[1,1]
dummymarkov[rownames(tmp_table)[2],colnames(tmp_table)[1]]<-tmp_table[2,1]
dummymarkov[rownames(tmp_table)[1],colnames(tmp_table)[2]]<-tmp_table[1,2]
dummymarkov[rownames(tmp_table)[2],colnames(tmp_table)[2]]<-tmp_table[2,2]
##repeat process until finished, then use dummymarkov to calculate the transition matrix..