2016-05-03 1 views
0

ce qui serait un bon programme qui pourrait automatiser et remplir la matrice A?Comment insérer des probabilités dans une matrice?

Nous avons le vecteur col:

col=c(1,1,2,3,4,5,10,7,7,3,1,5,3,7,6,3,4,2,1,1,2,2,6,4,8,8,9,1,3,2) 
col 
[1] 1 1 2 3 4 5 10 7 7 3 1 5 3 7 6 3 4 2 1 1 2 2 6 4 8 
[26] 8 9 1 3 2 

Et nous avons la matrice:

A=rbind(c(0:10),c(1,rep(0,10)),c(2,rep(0,10)),c(3,rep(0,10)),c(4,rep(0,10)),c(5,rep(0,10)),c(6,rep(0,10)),c(7,rep(0,10)),c(8,rep(0,10)),c(9,rep(0,10)),c(10,rep(0,10))) 
A 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] 
[1,] 0 1 2 3 4 5 6 7 8  9 10 
[2,] 1 0 0 0 0 0 0 0 0  0  0 
[3,] 2 0 0 0 0 0 0 0 0  0  0 
[4,] 3 0 0 0 0 0 0 0 0  0  0 
[5,] 4 0 0 0 0 0 0 0 0  0  0 
[6,] 5 0 0 0 0 0 0 0 0  0  0 
[7,] 6 0 0 0 0 0 0 0 0  0  0 
[8,] 7 0 0 0 0 0 0 0 0  0  0 
[9,] 8 0 0 0 0 0 0 0 0  0  0 
[10,] 9 0 0 0 0 0 0 0 0  0  0 
[11,] 10 0 0 0 0 0 0 0 0  0  0 

La première colonne de la matrice A représente les valeurs précédentes dans le vecteur col

Le premier rangée de la matrice A représente les valeurs suivantes dans le vecteur col Dans la matrice A, nous aimerions remplacer les 0 et stocker le probab conditionnel les choses. En regardant le vecteur col, je regarde toutes les instances qui impliquent 1 comme un nombre précédent tel que 1,1,2, 1,5, 1,1,2 1,3.

Et je suis venu avec les probabilités conditionnelles suivantes:

Étant donné que le numéro précédent était 1 dans le vecteur de col, la probabilité que le nombre suivant est égal à 1 à: 2/6. Etant donné que le nombre précédent était 1, la probabilité que le nombre suivant soit égal à 2 est de: 2/6. Étant donné que le nombre précédent était 1, la probabilité que le nombre suivant soit égal à 3 est de: 1/6. Étant donné que le nombre précédent était 1, la probabilité que le nombre suivant soit égal à 5 ​​est de 1/5.

Nous utilisons ces valeurs pour remplir la première ligne de la matrice A.And nous obtenons une nouvelle version de A.

A=rbind(c(0:10),c(1,2/6,2/6,1/6,0,1/6,0,0,0,0,0),c(2,rep(0,10)),c(3,rep(0,10)),c(4,rep(0,10)),c(5,rep(0,10)),c(6,rep(0,10)),c(7,rep(0,10)),c(8,rep(0,10)),c(9,rep(0,10)),c(10,rep(0,10))) 
> A 
     [,1]  [,2]  [,3]  [,4] [,5]  [,6] [,7] [,8] [,9] [,10] [,11] 
[1,] 0 1.0000000 2.0000000 3.0000000 4 5.0000000 6 7 8  9 10 
[2,] 1 0.3333333 0.3333333 0.1666667 0 0.1666667 0 0 0  0  0 
[3,] 2 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[4,] 3 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[5,] 4 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[6,] 5 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[7,] 6 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[8,] 7 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[9,] 8 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[10,] 9 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[11,] 10 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 

Nous voulons remplir le 2ème rang, 3ème tout le chemin jusqu'à 10.

Je l'ai fait manuellement mais quel serait un bon programme qui pourrait automatiser et remplir la matrice A?

Répondre

1

Je ne sais pas si cela est l'approche la plus efficace, en utilisant aggregate et dcast:

# Get data. 
col=c(1,1,2,3,4,5,10,7,7,3,1,5,3,7,6,3,4,2,1,1,2,2,6,4,8,8,9,1,3,2) 

# Make shifted vector and make a data frame. 
index <- 1:length(col) - 1 
index <- tail(index, length(col) - 1) 
col.shift <- c(col[index + 1], NA) 
df <- data.frame(list("value" = col, "next.value" = col.shift)) 

# Count number of values per combination. 
df$count <- 1 
# Count number of value appearences.. 
df.agg.row <- aggregate(count ~ value, df, FUN = sum) 

# Pivot the data. 
library(reshape2) 
res <- dcast(df, value ~ next.value, fun.aggregate = length) 

# Get probability of number (row) being followed by number (col). 
res2 <- res[, 2:11]/df.agg.row$count 
0

Merci à tous pour vos commentaires. J'ai été capable de trouver une réponse à ma propre question. Si quelqu'un est intéressé, vous pouvez vérifier ma solution.

A=rbind(c(0:10),c(1,rep(0,10)),c(2,rep(0,10)),c(3,rep(0,10)),c(4,rep(0,10)),c(5,rep(0,10)),c(6,rep(0,10)),c(7,rep(0,10)),c(8,rep(0,10)),c(9,rep(0,10)),c(10,rep(0,10))) 
    col=c(1,1,2,3,4,5,10,7,7,3,1,5,3,7,6,3,4,2,1,1,2,2,6,4,8,8,9,1,3,2) 
    j=length(col) 
    A 
    while (j>1){ 
    if (col[j]==col[j-1]){A[match(col[j],A[,1]),match(col[j-1],A[1,])]=A[match(col[j],A[,1]),match(col[j-1],A[1,])]+1}else{ 
    if (col[j]!=col[j-1]){A[match(col[j],A[,1]),match(col[j-1],A[1,])]=A[match(col[j],A[,1]),match(col[j-1],A[1,])]+1} } 
    j=j-1 
    } 
    A 
    A=t(A) 
    A=A[-1,-1] 
    for (i in 1:nrow(A)){ 
    A[i,]=A[i,]/sum(A[1,]) 
    } 
    A 
+0

Ce sera très lent. 'for' ou' while' dans R devrait être utilisé dans des cas exceptionnels. – Bulat