我想首先计算马尔可夫转移矩阵,然后对其进行指数计算。为了实现第一个目标,我在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
答案 0 :(得分:4)
您可以直接从markovchainFit
返回的对象访问转换矩阵:
rgdp_e_trans$estimate@transitionMatrix
此处rgdp_e_trans
是markovchainFit
的返回值,实际上是一个包含拟合过程信息的列表。您可以使用estimates
运算符访问该列表的$
项。 estimate
对象来自正式的S4类(参见例如Hadley Wickham的Advanced R,其中描述了R)中使用的对象系统,这就是为什么要访问它的项目,你必须使用@
运算符,而不是用于更常见的S3对象的标准$
。
如果您打印出as.matrix(rgdp_e_trans)
的返回值,那么在您的初始方法出错时,应立即显而易见。一般来说,当您遇到意外结果或使用新类型的对象时,使用str
函数检查对象的结构是一个好主意 - 而不是依赖于它的打印方法。