2011-01-20 6 views
1

Je suis en train de mettre en œuvre une mesure de centre-périphérie réseau à partir d'un article (lien: Borgatti & Everett 2000) R. L'approche de base appliqué par les auteurs est de:Les réseaux sociaux et les algorithmes génétiques en R

  1. Réorganiser les lignes et les colonnes de la matrice de réseau afin que les acteurs qui sont bien connectés les uns aux autres occupent le coin supérieur gauche.

  2. créer une matrice de motif idéal sur la base de la rangée/Agencement de colonne dans l'étape 1

  3. évaluer la corrélation entre les deux matrices

Selon les auteurs de la tour dans la première étape consiste à trouver l'arrangement ligne/colonne de la matrice qui corrèle le plus haut avec sa matrice de motifs induits, et ils recommandent d'utiliser un algorithme génétique pour trouver la meilleure disposition rangée/colonne. Je suis coincé dans les premières étapes de l'algorithme:

  1. Comment puis-je en R créer des arrangements de matrice ligne/colonne aléatoire qui préservent l'ordre des entrées colonne/ligne? Une fois que j'ai évalué l'ajustement entre les arrangements matriciels et les matrices de modèles, comment "multiplier" de nouveaux arrangements matriciels basés sur les matrices "les plus aptes"?

Merci.

Répondre

2

Etant donnée une matrice d'une taille particulière, vous pouvez générer des arrangements de matrice ligne/colonne aléatoire en tant que telle

#create fake data 
mydata.block1 <- matrix (rep(1, times=100), ncol=10) 
mydata.block2 <- matrix (rep(0, times=900), ncol=90) 
mydata.block3 <- matrix (rep(0, times=900), ncol=10) 
mydata.block4 <- matrix (rep(1, times=8100), ncol=90) 

mydata <- rbind(cbind (mydata.block1, mydata.block2), cbind (mydata.block3, mydata.block4)) 

#Mix mydata 
mix.order <- sample(1:dim (mydata)[1]) 
mydata <- mydata[mix.order,mix.order] 

#create 100 random orderings 

##preallocate matrix 
rand.samp <- matrix (rep(NA, times=10000), ncol=100) 
##create orderings 
for (i in 1:100){ 
rand.samp[i,] <- sample(1:dim (mydata)[1]) 
} 
##Eliminate duplicate orderings (unlikely to occur) 
rand.samp <- unique (rand.samp) 


#Reorder and measure fitness 
##preallocate fitness measure 
fit.meas <- rep (NA, times=100) 

for (i in 1:100){ 
mydata.reordered <- mydata[rand.samp[i,],rand.samp[i,]] 
fit.meas[i] <- myfitnessfunc(mydata.reordered) 
} 

Une fois que vous avez mesuré remise en forme, vous aurez besoin d'un moyen de déterminer quels domaines contribuent à la remise en forme et réparez-les en modifiant d'autres zones («race»). Peut-être que dist() sera utile. Peut-être qu'un heatmap ou clustering, hclust(), serait également utile? Pouvez-vous fournir plus de détails sur la façon dont vous détermineriez la condition physique localisée?

2

La réponse OneWhoIsUnnamed est la même que j'ai interprété votre besoin de # 1.

est ici une méthode de recombinaison à base de conditionnement physique pour deux matrices de contiguïté, # 2:

que vous avez deux matrices, A et B, qui ont des noyaux de fitness Fa et Fb de 2,3 et 1,1, respectivement. Élever les matrices en construisant une nouvelle matrice, C, où C_ {i} = A_ {i} avec probabilité Fa/(Fa + Fb) ou C_ {i} = B_ {i} avec probabilité 1-Fa/(Fa + Fb). Ceci est juste l'un des moyens illimités de reproduction des matrices. M est le résultat accouplé de A et B en fonction de leur condition physique.

# lets define a function to create random adjacency matrices 
random_adjacent <- function(dimension) 
{ 
    ret <- matrix(runif(dimension^2)>0.5,dimension,dimension) 
    retl <- ret * lower.tri(ret) 
    return(retl + t(retl)) 
} 
# set fitness 
Fa <- 2.3 
Fb <- 1.1 
# initialize matrices 
A <- random_adjacent(4) 
B <- random_adjacent(4) 
# compute symmetric fitness probability matrix 
C <- matrix(runif(16)<Fa/(Fa+Fb),4,4) 
Cl <- C * lower.tri(C) # take the lower triangular portion 
C <- Cl + t(Cl)  # reflect the lower triangular portion into the upper 
# compute mated result 
M <- matrix(0,4,4) 
M[C] <- A[C] 
M[!C] <- B[!C] 
+0

merci beaucoup pour la réponse, mais quand je teste le code, il semble créer de nouvelles entrées dans la matrice. Puisque j'ai affaire à une matrice d'adjacence, la somme de 1s devrait être constante, il s'agit juste des colonnes et des rangées qui doivent être réarrangées. –

+0

Thomas, je ne suis pas un expert des opérateurs de recombinaison sur les matrices d'adjacence. J'ai cependant mis à jour ma réponse pour que la matrice de probabilités de fitness soit symétrique - cela fera que le résultat M soit aussi une matrice d'adjacence, je crois. –

Questions connexes