2016-07-27 8 views
0

Ich habe eine Übergangsmatrix als eine 'von Cluster' (Zeilen) 'zu Cluster' (Spalten) Frequenz erstellt. Denken Sie Markov-Kette.Übergangsmatrix Kraft ncol zu gleichen nrows

Angenommen, ich habe 5 Cluster, aber nur 3 Cluster, dann bekomme ich eine 5 * 3 Übergangsmatrix. Wie kann man eine 5 * 5 Übergangsmatrix erzwingen? Effektiv, wie ich die Nullspalten zeige?

Ich bin nach einer eleganten Lösung, da dies auf ein viel größeres Problem mit Hunderten von Clustern angewendet wird. Ich bin wirklich ziemlich unbekannt mit R Matrix's und meines Wissens, ich kenne keine elegante Möglichkeit, Anzahl der Spalten zu zwingen, Anzahl der Zeilen einzugeben, dann Nullstellen, wo keine Übereinstimmung, außer der Verwendung einer for-Schleife, die meine Ahnung ist, ist nicht die beste Lösung.

Beispielcode:

# example data 
cluster_before <- c(1,2,3,4,5) 
cluster_after <- c(1,2,4,4,1) 

# Table output 
table(cluster_before,cluster_after) 
# ncol does not = nrows. I want to rectify that 

# I want output to look like this: 
what_I_want <- matrix(
    c(1,0,0,0,0, 
    0,1,0,0,0, 
    0,0,0,1,0, 
    0,0,0,1,0, 
    1,0,0,0,0), 
    byrow=TRUE,ncol=5 
) 

# Possible solution. But for loop can't be best solution? 
empty_mat <- matrix(0,ncol=5,nrow=5) 

matrix_to_update <- empty_mat 

for (i in 1:length(cluster_before)) { 
val_before <- cluster_before[i] 
val_after <- cluster_after[i] 
matrix_to_update[val_before,val_after] <- matrix_to_update[val_before,val_after]+1 
} 
matrix_to_update 
# What's the more elegant solution? 

Vielen Dank im Voraus für Ihre Hilfe. Es ist sehr geschätzt.

+0

BTW, meinst du, die Zeilen seien * von * und die Spalten * zu *? Normalerweise ist die Übergangsmatrix für ein Markov-Modell so, dass "state_after = T * state_before" ist. – aichao

+0

Yep Zeilen von Spalten zu: 'von Cluster' (Zeilen) 'zu Cluster' (Spalten) – jc52766

Antwort

3

Machen sie factor s und dann table:

levs <- union(cluster_before, cluster_after) 
table(factor(cluster_before,levs), factor(cluster_after,levs)) 

# 1 2 3 4 5 
# 1 1 0 0 0 0 
# 2 0 1 0 0 0 
# 3 0 0 0 1 0 
# 4 0 0 0 1 0 
# 5 1 0 0 0 0 
1

Eine andere Lösung ist Matrix indicies zu verwenden:

what_I_want <- matrix(0,ncol=5,nrow=5) 
what_I_want[cbind(cluster_before,cluster_after)] <- 1 
print(what_I_want) 
##  [,1] [,2] [,3] [,4] [,5] 
##[1,] 1 0 0 0 0 
##[2,] 0 1 0 0 0 
##[3,] 0 0 0 1 0 
##[4,] 0 0 0 1 0 
##[5,] 1 0 0 0 0 

Die zweite Zeile stellt die Elemente entsprechend der Reihe (cluster_before) und Spalte (cluster_after) Indizes zu 1.

Hoffe, das hilft.

+0

Danke Ich werde in Matrix Indizes in R suchen. Ich möchte auf jeden Fall mehr vertraut mit dem Umgang mit Matrizen in R Die Indizierung durch cbind nach dem Erstellen einer Nullmatrix ist eine großartige Lösung. – jc52766