2014-01-27 52 views
5

考慮以下數據幀:1,2,3,4,5過渡矩陣

df = data.frame(cusip = paste("A", 1:10, sep = ""), xt = c(1,2,3,2,3,5,2,4,5,1), xt1 = c(1,4,2,1,1,4,2,2,2,5)) 

數據在五個狀態,這是位數實際上劃分。 數據幀的第一列表示時間t的狀態,第二列是時間t + 1的狀態。

我想計算一種五種狀態的轉換矩陣。矩陣的含義將是如下:

  • (行,列)=(1,1):即均位數1在時間, 和在時間住在1 cusips的% t + 1的
  • (行,列)=(1,2):即均位數1在,和 在噸+ 1
  • 等成爲位數2 cusips的%...

我真的不知道如何以有效的方式做到這一點。我有這樣的感覺,答案是微不足道的,但我無法理解它。

任何人都可以請幫忙嗎?

回答

5
res <- with(df, table(xt, xt1)) ## table() to form transition matrix 
res/rowSums(res)    ## /rowSums() to normalize by row 
# xt1 
# xt   1   2   4   5 
# 1 0.5000000 0.0000000 0.0000000 0.5000000 
# 2 0.3333333 0.3333333 0.3333333 0.0000000 
# 3 0.5000000 0.5000000 0.0000000 0.0000000 
# 4 0.0000000 1.0000000 0.0000000 0.0000000 
# 5 0.0000000 0.5000000 0.5000000 0.0000000 

## As an alternative to 2nd line above, use sweep(), which won't rely on 
## implicit recycling of vector returned by rowSums(res) 
sweep(res, MARGIN = 1, STATS = rowSums(res), FUN = `/`) 
+0

完美!你能否詳細說明第一行的內容? – Mayou

+1

給定n個參數,'table()'形成一個n維數組,其元素包含每個特定的'xt'和'xt1'組合在數據中出現的次數。 '(df,...)'只是形成一個本地評估環境,其中'xt'和'xt1'(以及'df'中的任何其他命名列)將直接可見:該語句實質上是'table df $ xt,df $ xt1)'。 –

+0

非常感謝您的徹底解答!很有幫助! – Mayou

0

如果你想在過渡矩陣的列的所有狀態(1..5),你可以試試這個:

levs <- sort(union(df$xt, df$xt1)) 
tbl <- table(factor(df$xt, levs), factor(df$xt1, levs)) 
tbl/rowSums(tbl) 

     1   2   3   4   5 
    1 0.5000000 0.0000000 0.0000000 0.0000000 0.5000000 
    2 0.3333333 0.3333333 0.0000000 0.3333333 0.0000000 
    3 0.5000000 0.5000000 0.0000000 0.0000000 0.0000000 
    4 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 
    5 0.0000000 0.5000000 0.0000000 0.5000000 0.0000000