从markovchainFit对象访问转换矩阵

从markovchainFit对象访问转换矩阵,r,matrix,dataframe,numeric,R,Matrix,Dataframe,Numeric,我想先计算一个马尔可夫转移矩阵,然后取它的指数。为了实现第一个目标,我在markovchain包中使用markovchainFit函数,它返回一个data.frame,而不是一个矩阵。所以在取指数之前,我需要把它转换成矩阵。 我的R代码片段如下 ################################# # Estimate Transition Matrix # ################################# setwd("G:/Data_backup/GDP

我想先计算一个马尔可夫转移矩阵,然后取它的指数。为了实现第一个目标,我在
markovchain
包中使用
markovchainFit
函数,它返回一个data.frame,而不是一个矩阵。所以在取指数之前,我需要把它转换成矩阵。 我的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

在stackoverflow中进行了一些搜索工作后,我发现共享类似的问题,并使用
rgdp_e_trans您可以直接从
markovchainFit
返回的对象访问转换矩阵,如下所示:

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


如果您将
as.matrix(rgdp_e_trans)
的返回值打印出来,您的初始方法哪里出了问题,这一点应该会立即显现出来。通常,当遇到意外结果或使用新类型的对象时,最好使用
str
函数检查对象的结构,而不是依赖其打印方法。

您可以直接从
markovchainFit
返回的对象访问转换矩阵,如下所示:

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


如果您将
as.matrix(rgdp_e_trans)
的返回值打印出来,您的初始方法哪里出了问题,这一点应该会立即显现出来。一般来说,当您遇到意外结果或正在处理新类型的对象时,最好使用
str
功能检查对象的结构,而不是依赖其打印方法。

尝试
rgdp\u e\u trans$estimate%^%1/5
。似乎不起作用<代码>>rgdp_e_trans$estimate%^%1/5 rgdp_e_trans$estimate%^%1中的错误:不是矩阵
在使用
markovchainFit
创建后,是否可以添加
str(rgdp_e_trans)
的输出,您是否在转换前或转换后执行了
rgdp_e_trans$estimate%^%1/5
?@MikkoMarttila对由于时间延迟导致的延迟回复表示道歉。我根据你的建议添加了更多信息,请参见我问题的底部。谢谢。请尝试
rgdp\u e\u trans$estimate%^%1/5
。似乎不起作用<代码>>rgdp_e_trans$estimate%^%1/5 rgdp_e_trans$estimate%^%1中的错误:不是矩阵在使用
markovchainFit
创建后,是否可以添加
str(rgdp_e_trans)
的输出,您是否在转换前或转换后执行了
rgdp_e_trans$estimate%^%1/5
?@MikkoMarttila对由于时间延迟导致的延迟回复表示道歉。我根据你的建议添加了更多信息,请参见我问题的底部。谢谢你,很有效。此外,为了以防万一(正如我所做的),您还可以通过rgdp_e_trans访问州名称$estimate@states.It作品此外,为了以防万一(正如我所做的),您还可以通过rgdp_e_trans访问州名称$estimate@states.
> 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"
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
rgdp_e_trans$estimate@transitionMatrix