2016-06-19 1 views
0

Je veux d'abord calculer une matrice de transition markov puis en prendre l'exposant. Pour atteindre le premier but j'utilise la fonction markovchainFit dans le paquet markovchain et il me renvoie un data.frame, plutôt qu'une matrice. J'ai donc besoin de le convertir en matrice avant de prendre l'exposant. Mon extrait de code R est commeMatrice de transition d'accès à partir de l'objet markovchainFit

################################# 
# 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 

le rgdp_e_trans est une trame de données, et je tente de le convertir en une matrice numérique. Il semble fonctionner quand je le teste en utilisant la commande is.matrix. Cependant, la dernière ligne me donne une erreur dit

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

Après quelques travaux de recherche dans StackOverflow, je trouve this question partage le même problème et utiliser rgdp_e_trans<-as.numeric(unlist(rgdp_e_trans)) pour forcer l'objet à `double », mais il semble fonctionne pas. Par ailleurs, les rgdp_e_trans de data.frame contient aucun facteur ou caractères La sortie de la console est comme

> 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' 
> 

Toute suggestion de résoudre le problème, ou autre façon de calculer l'exposant? Je vous remercie.


supplémentaires:

> str(rgdp_e_trans) 
List of 1 
$ estimate:Formal class 'markovchain' [package "markovchain"] with 4 slots 
    .. [email protected] states   : chr [1:5] "1" "2" "3" "4" ... 
    .. [email protected] byrow   : logi TRUE 
    .. [email protected] 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" ... 
    .. [email protected] name   : chr "Bootstrap Mc" 

et je commente la partie 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

Essayez 'rgdp_e_trans $ estimation% ^% 1/5'. –

+0

Ne semble pas fonctionner. '> rgdp_e_trans $ estimation% ^% 1/5 Erreur dans rgdp_e_trans $ estimation% ^% 1: pas une matrice' – zlqs1985

+0

Pourriez-vous ajouter la sortie de' str (rgdp_e_trans) 'après l'avoir créée avec' markovchainFit'? –

Répondre

4

Vous pouvez accéder à la matrice de transition directement à partir de l'objet retourné par markovchainFit comme:

[email protected] 

Ici rgdp_e_trans est votre valeur de retour de markovchainFit, qui est en fait une liste contenant les informations du processus d'ajustement. Vous accédez à l'élément estimates de cette liste à l'aide de l'opérateur $. L'objet estimate provient d'une classe formelle S4 (voir par exemple Advanced R par Hadley Wickham pour une description des systèmes d'objets utilisés dans R), c'est pourquoi pour accéder à ses éléments, vous devez utiliser l'opérateur @ au lieu du standard $ utilisé pour les objets S3 plus communs.

Si vous imprimez la valeur de retour de as.matrix(rgdp_e_trans), votre première approche devrait être immédiatement évidente. En général, il est judicieux de vérifier la structure d'un objet avec la fonction str - au lieu de s'appuyer sur sa méthode d'impression - lorsque vous rencontrez des résultats inattendus ou que vous travaillez avec de nouveaux types d'objets.

+0

Cela fonctionne. Aussi, juste au cas où vous en auriez besoin (comme je l'ai fait), vous pouvez également accéder aux noms d'états via rgdp_e_trans $ estimate @ states. – Jefferson