从markovchainFit对象访问转换矩阵

时间:2016-06-19 09:01:52

标签: r matrix dataframe numeric

我想首先计算马尔可夫转移矩阵,然后对其进行指数计算。为了实现第一个目标,我在markovchainFit包中使用markovchain函数,它返回一个data.frame,而不是矩阵。所以我需要在使用exponent之前将其转换为矩阵。 我的R代码片段就像

#################################
#  Estimate Transition Matrix   #
#################################
setwd("G:/Data_backup/GDP_per_Capita")

library("foreign")
library("Hmisc")
mydata <- stata.get("G:/Data_backup/GDP_per_Capita/states.dta")
mydata

library(markovchain)
library(expm)

rgdp_e=mydata[,2:7]
rgdp_o=mydata[,8:13]
createSequenceMatrix(rgdp_e)
rgdp_e_trans<-markovchainFit(data=rgdp_e,,method="bootstrap",nboot=5, name="Bootstrap Mc")
rgdp_e_trans<-as.numeric(unlist(rgdp_e_trans))
rgdp_e_trans<-as.matrix(rgdp_e_trans)
is.matrix(rgdp_e_trans)
rgdp_e_trans %^% 1/5

rgdp_e_trans是一个数据框,我尝试将其转换为数字矩阵。当我使用is.matrix命令测试它时似乎工作。但是,最后一行给我一个错误说

Error in rgdp_e_trans %^% 2 : 
  (list) object cannot be coerced to type 'double'

在stackoverflow中进行了一些搜索工作之后,我发现this question共享了类似的问题,并使用rgdp_e_trans<-as.numeric(unlist(rgdp_e_trans))强制该对象为“double”,但似乎无法正常工作。 此外,data.frame rgdp_e_trans不包含因子或字符 控制台中的输出类似于

> rgdp_e=mydata[,2:7]
> rgdp_o=mydata[,8:13]
> createSequenceMatrix(rgdp_e)
Error: not compatible with STRSXP
> rgdp_e_trans<-markovchainFit(data=rgdp_e,,method="bootstrap",nboot=5, name="Bootstrap Mc")
> rgdp_e_trans
$estimate
          1          2          3           4          5
1 0.6172840 0.18930041 0.09053498 0.074074074 0.02880658
2 0.1125828 0.59602649 0.28476821 0.006622517 0.00000000
3 0.0000000 0.03846154 0.60256410 0.358974359 0.00000000
4 0.0000000 0.01162791 0.03488372 0.691860465 0.26162791
5 0.0000000 0.00000000 0.00000000 0.044247788 0.95575221


> rgdp_e_trans<-as.numeric(unlist(rgdp_e_trans))
Error: (list) object cannot be coerced to type 'double'
> rgdp_e_trans<-as.matrix(rgdp_e_trans)
> is.matrix(rgdp_e_trans)
[1] TRUE
> rgdp_e_trans %^% 1/5
Error in rgdp_e_trans %^% 1 : 
  (list) object cannot be coerced to type 'double'
> 

任何修复问题的建议,或计算指数的替代方法?谢谢。

其他:

> str(rgdp_e_trans)
List of 1
 $ estimate:Formal class 'markovchain' [package "markovchain"] with 4 slots
  .. ..@ states          : chr [1:5] "1" "2" "3" "4" ...
  .. ..@ byrow           : logi TRUE
  .. ..@ transitionMatrix: num [1:5, 1:5] 0.617 0.113 0 0 0 ...
  .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. ..$ : chr [1:5] "1" "2" "3" "4" ...
  .. .. .. ..$ : chr [1:5] "1" "2" "3" "4" ...
  .. ..@ name            : chr "Bootstrap Mc"

我注释掉as.matrix部分

rgdp_e=mydata[,2:7]
rgdp_o=mydata[,8:13]
createSequenceMatrix(rgdp_e)
rgdp_e_trans<-markovchainFit(data=rgdp_e,,method="bootstrap",nboot=5, name="Bootstrap Mc")
rgdp_e_trans
str(rgdp_e_trans)
# rgdp_e_trans<-as.numeric(unlist(rgdp_e_trans))
# rgdp_e_trans<-as.matrix(rgdp_e_trans)
# is.matrix(rgdp_e_trans)
rgdp_e_trans$estimate %^% 1/5

1 个答案:

答案 0 :(得分:4)

您可以直接从markovchainFit返回的对象访问转换矩阵:

rgdp_e_trans$estimate@transitionMatrix

此处rgdp_e_transmarkovchainFit的返回值,实际上是一个包含拟合过程信息的列表。您可以使用estimates运算符访问该列表的$项。 estimate对象来自正式的S4类(参见例如Hadley Wickham的Advanced R,其中描述了R)中使用的对象系统,这就是为什么要访问它的项目,你必须使用@运算符,而不是用于更常见的S3对象的标准$

如果您打印出as.matrix(rgdp_e_trans)的返回值,那么在您的初始方法出错时,应立即显而易见。一般来说,当您遇到意外结果或使用新类型的对象时,使用str函数检查对象的结构是一个好主意 - 而不是依赖于它的打印方法。