L’obiettivo è studiare la centralità degli attori di una rete sociale di delfini appartenenti ad una comunità che vive nel fiordo di Doubtful Sound in Nuova Zelanda. Le condizioni inusuali di questo fiordo, con acqua relativamente fredda e con uno strato di acqua dolce in superficie, hanno limitato le uscite di esemplari e l’arrivo di nuovi delfini nel gruppo, facilitando una intensa relazione sociale tra i delfini della comunità. La rete è un grafo indiretto che contiene 62 nodi delfini e 159 connessioni tra coppie di delfini. Due delfini sono associati da un arco se, nel periodo di osservazione durato dal 1994 al 2001, essi sono stati avvistati assieme più frequentemente di quanto il caso avrebbe voluto. E’ noto il sesso di quasi tutti gli esemplari.
Avviare R da un terminale con l’omonimo comando e, se non già fatto, installare il pacchetto:
igraph
per l’analisi delle retirgl
per la visualizzazione 3Dscales
per scalare la dimensione dei nodilsa
per il calcolo del coseno di similaritàineq
per il calcolo del coefficiente di Gini e curva di Lorenzmoments
per il calcolo dell’indice di asimmetriainstall.packages(c("igraph", "rgl", "scales", "lsa", "ineq", "moments"))
Quindi caricare i pacchetti installati:
library(igraph)
library(rgl)
library(scales)
library(lsa)
library(ineq)
library(moments)
e leggere la rete dolphin.gml:
g = read.graph(file="dolphin.gml", format="gml")
Notate che i nodi hanno tre attributi: id (un identificatore numerico), label (il nome del delfino), e sex (il sesso, M per maschio, F per femmina, U per sconosciuto).
Visualizzare il numero di nodi e il numero di archi del grafo. Calcolare la densità del grafo (numero di archi del grafo fratto numero massimo di archi del grafo). Il grafo è sparso o denso? Contare il numero di esemplari maschi e femmine e la relativa percentuale.
n = vcount(g)
n
## [1] 62
m = ecount(g)
m
## [1] 159
graph.density(g)
## [1] 0.0840825
sex = V(g)$sex
male = sex == "M"
female = sex == "F"
shemale = sex == "U"
n.male = sum(male)
n.female = sum(female)
round(100 * (n.male / n))
## [1] 53
round(100 * (n.female / n))
## [1] 40
Visualizzare la rete con il metodo di Fruchterman e Reingold (layout.fruchterman.reingold
) usando come etichette dei nodi il nome del delfino, oppure il suo identificatore numerico, oppure nessuna etichetta. Visualizzare i nodi femmina in rosa e i nodi maschi in blu. Visualizzare il sottografo delle femmine e quello dei maschi. Provare altre visualizzazioni: casuale (layout.random
), circolare (layout.circle
) e sferica (layout.sphere
).
coords = layout.fruchterman.reingold(g)
plot(g, layout=coords, vertex.label=V(g)$label, vertex.shape="none")
plot(g, layout=coords, vertex.label=V(g)$id, vertex.size=12)
plot(g, layout=coords, vertex.label=NA, vertex.size=5)
V(g)[male]$color = "blue"
V(g)[female]$color = "pink"
V(g)[shemale]$color = "green"
plot(g, layout=coords, vertex.label=NA, vertex.size=5)
g.male = induced.subgraph(g, V(g)[male])
coords.male = layout.fruchterman.reingold(g.male)
plot(g.male, layout=coords.male, vertex.label=NA, vertex.size=5)
g.female = induced.subgraph(g, V(g)[female])
coords.female = layout.fruchterman.reingold(g.female)
plot(g.female, layout=coords.female, vertex.label=NA, vertex.size=5)
plot(g, layout=layout.random(g), vertex.label=NA, vertex.size=5)
plot(g, layout=layout.circle(g), vertex.label=NA, vertex.size=5)
plot(g, layout=layout.sphere(g), vertex.label=NA, vertex.size=5)
Visualizzare la rete in 3D con il metodo di Fruchterman e Reingold usando come etichette dei nodi il nome del delfino.
coords3D = layout.fruchterman.reingold(g, dim=3)
rglplot(g, layout=coords3D, vertex.size=5, vertex.label.dist=0.2)
Scrivere in Shiny una applicazione che visualizza la rete dei delfini. L’utente:
L’applicazione visualizza la rete in base alle scelte dell’utente. La soluzione di può scaricare qui
Calcolare la centralità per grado dei nodi. Calcolare le seguenti statistiche descrittive della distribuzione dei gradi: minimo, massimo, media, mediana, primo e terzo quartile. Notare come si posiziona la media rispetto alla mediana. Generare un istogramma dei gradi dei nodi. Etichettare il vettore dei gradi con i nomi dei delfini e visualizzarlo in ordine decrescente rispetto al grado. Visualizzare inoltre i tre delfini con grado maggiore. Sono femmine o maschi? Calcolare il grado medio degli esemplari femmina e maschio. Visualizzare la rete con i nodi di dimensione proporzionale al loro grado.
d = degree(g)
summary(d)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 3.000 5.000 5.129 7.000 12.000
hist(d, xlab="Degree", main="Histogram of node degree centrality", breaks=0:max(d))
names(d) = V(g)$label
sort(d, decreasing=TRUE)
## Grin SN4 Topless Scabs Trigger Jet
## 12 11 11 10 10 9
## Kringel Patchback Web Beescratch Gallatin SN63
## 9 9 9 8 8 8
## SN9 Feather Haecksel Jonah SN100 Stripes
## 8 7 7 7 7 7
## TR99 Upbang Beak DN21 Double Hook
## 7 7 6 6 6 6
## MN105 MN83 SN96 TR77 DN63 Fish
## 6 6 6 6 5 5
## Number1 Oscar PL Shmuddel SN90 Zap
## 5 5 5 5 5 5
## Bumper DN16 Knit Thumper TSN103 CCL
## 4 4 4 4 4 3
## MN60 Mus Notch Ripplefluke Zipfel SN89
## 3 3 3 3 3 2
## TR120 TR88 TSN83 Vau Wave Cross
## 2 2 2 2 2 1
## Five Fork MN23 Quasi SMN5 TR82
## 1 1 1 1 1 1
## Whitetip Zig
## 1 1
top = sort(d, decreasing=TRUE)[1:3]
id.top = match(names(top), V(g)$label)
V(g)[id.top]$sex
## [1] "F" "F" "M"
mean(d[male])
## [1] 5.060606
mean(d[female])
## [1] 5.6
mean(d[female]) / mean(d[male])
## [1] 1.106587
plot(g, layout=coords, vertex.label=NA, vertex.size = rescale(d, to = c(1, 10)))
Fare lo stesso per la centralità per autovettore. A cosa corrisponde il picco più a destra nella distribuzione della centralità? Identificare nella rete i nodi con massima centralità. Notate qualcosa di peculiare? Qual è la centralità media delle femmine e dei maschi?
e = evcent(g)$vector
summary(e)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.001697 0.057960 0.150200 0.287500 0.503200 1.000000
hist(e, xlab="Eigenvector", main="Histogram of node eigenvector centrality", breaks=seq(min(e), max(e), (max(e) - min(e))/10))
names(e) = V(g)$label
sort(e, decreasing=TRUE)
## Grin SN4 Topless Scabs TR99 Patchback
## 1.000000000 0.951799805 0.902535447 0.890164531 0.689371799 0.670597148
## Trigger Hook SN9 MN105 Jonah SN63
## 0.667174334 0.658662305 0.658274865 0.656626545 0.641246650 0.622635601
## MN83 Stripes Kringel Haecksel Double Shmuddel
## 0.611855811 0.602753892 0.584190651 0.519900956 0.453166274 0.439631520
## SN100 TSN103 Beak Zap MN60 SN96
## 0.420422139 0.410295522 0.406936369 0.354099734 0.276652586 0.256347364
## TR77 CCL Thumper Fish Oscar Vau
## 0.254512313 0.251231996 0.246379351 0.238307667 0.216045624 0.165017929
## Zipfel DN63 Beescratch PL Bumper Fork
## 0.164642902 0.135855976 0.133243924 0.129035668 0.125900178 0.123743716
## TSN83 TR120 SMN5 Five Cross Whitetip
## 0.106677505 0.094104252 0.093221175 0.092745362 0.092745362 0.086553935
## TR88 Upbang SN89 Knit Jet Web
## 0.074195776 0.072841218 0.066093022 0.065471512 0.055457225 0.055025554
## Number1 SN90 Gallatin Feather DN21 Notch
## 0.051672193 0.048272317 0.047515861 0.038625862 0.038606459 0.028323131
## DN16 Mus Ripplefluke Wave MN23 Quasi
## 0.020771413 0.018829555 0.012210714 0.008254248 0.007709230 0.007709230
## TR82 Zig
## 0.007649223 0.001697438
top = sort(e, decreasing=TRUE)[1:3]
id.top = match(names(top), V(g)$label)
V(g)[id.top]$sex
## [1] "F" "F" "M"
mean(e[male])
## [1] 0.2103415
mean(e[female])
## [1] 0.4160132
mean(e[female]) / mean(e[male])
## [1] 1.977799
plot(g, layout=coords, vertex.label=NA, vertex.size = rescale(e, to = c(1, 10)))
Ripetere le analisi per la centralità per vicinanza. A cosa corrispondono i due picchi nella distribuzione della centralità? Identificare nella rete i delfini con massima e minima centralità. Come sono posizionati rispetto agli altri?
c = closeness(g)
summary(c)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.002924 0.004288 0.005181 0.005037 0.005556 0.006849
hist(c, xlab="Closeness", main="Histogram of node closeness centrality", breaks=seq(min(c), max(c), (max(c) - min(c))/10))
names(c) = V(g)$label
sort(c, decreasing=TRUE)
## SN100 SN9 SN4 Kringel Grin Beescratch
## 0.006849315 0.006622517 0.006535948 0.006410256 0.006172840 0.006097561
## DN63 Oscar Scabs Double TR99 Beak
## 0.005988024 0.005988024 0.005988024 0.005952381 0.005747126 0.005681818
## Topless TSN103 Zap Haecksel TR77 Jonah
## 0.005681818 0.005617978 0.005617978 0.005555556 0.005555556 0.005524862
## Stripes SN89 MN105 MN60 Hook SN63
## 0.005524862 0.005494505 0.005464481 0.005464481 0.005405405 0.005405405
## SN96 Trigger Upbang Patchback PL Knit
## 0.005405405 0.005405405 0.005319149 0.005291005 0.005291005 0.005181347
## Number1 Shmuddel Fish MN83 Thumper Jet
## 0.005181347 0.005181347 0.005128205 0.005128205 0.005102041 0.005076142
## CCL Web Zipfel SN90 Bumper Notch
## 0.005050505 0.004950495 0.004950495 0.004878049 0.004629630 0.004545455
## Gallatin Vau Fork DN21 TSN83 TR120
## 0.004444444 0.004444444 0.004405286 0.004385965 0.004255319 0.004201681
## Mus Feather Cross Five Whitetip TR88
## 0.004184100 0.004132231 0.004081633 0.004081633 0.004081633 0.004048583
## SMN5 DN16 MN23 Quasi TR82 Ripplefluke
## 0.004016064 0.003906250 0.003891051 0.003891051 0.003816794 0.003546099
## Wave Zig
## 0.003496503 0.002923977
top = sort(c, decreasing=TRUE)[1:3]
id.top = match(names(top), V(g)$label)
V(g)[id.top]$sex
## [1] "F" "F" "F"
mean(c[male])
## [1] 0.004931279
mean(c[female])
## [1] 0.005292332
mean(c[female]) / mean(c[male])
## [1] 1.073217
plot(g, layout=coords, vertex.label=NA, vertex.size = rescale(c, to=c(1, 10)))
Ripetere le analisi per la centralità per intermediazione. Identificare nella rete il delfino con massima centralità. Come è posizionato rispetto agli altri?
b = betweenness(g)
summary(b)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 5.641 39.580 71.890 102.600 454.300
hist(b, xlab="Betweenness", main="Histogram of node betweenness centrality", breaks=seq(min(b), max(b), (max(b) - min(b))/10))
names(b) = V(g)$label
sort(b, decreasing=TRUE)
## SN100 Beescratch SN9 SN4 DN63 Jet
## 454.274069 390.383717 261.963619 253.582713 216.376673 209.169298
## Kringel Upbang Trigger Web SN89 Oscar
## 187.841704 181.392614 154.959376 154.094571 129.045705 122.165227
## Patchback Stripes Grin Scabs Gallatin SN63
## 119.918587 114.980006 113.408769 104.614585 96.708781 82.994597
## MN60 Topless TR99 Haecksel PL Ripplefluke
## 77.194498 74.426906 61.142194 60.924764 60.482343 60.000000
## Shmuddel DN21 Number1 SN96 SN90 TR77
## 59.831410 53.751742 53.503455 53.359052 42.550429 42.458701
## Double Feather Zap TSN103 Beak Fish
## 40.929300 38.236716 37.208978 35.198851 34.921151 29.448398
## Jonah Zipfel Knit MN105 Thumper Bumper
## 27.184466 25.976818 24.365341 23.242197 22.029185 16.603247
## MN83 DN16 Notch Hook TR120 CCL
## 13.510970 8.015949 7.983333 6.047619 5.505495 4.344048
## Mus TSN83 TR88 Vau Wave Cross
## 3.008730 2.183333 1.700000 1.605769 0.250000 0.000000
## Five Fork MN23 Quasi SMN5 TR82
## 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
## Whitetip Zig
## 0.000000 0.000000
top = sort(b, decreasing=TRUE)[1:3]
id.top = match(names(top), V(g)$label)
V(g)[id.top]$sex
## [1] "F" "M" "F"
mean(b[male])
## [1] 66.77166
mean(b[female])
## [1] 86.16572
mean(b[female]) / mean(b[male])
## [1] 1.290453
plot(g, layout=coords, vertex.label=NA, vertex.size = rescale(b, to = c(1, 10)))
Studiare la correlazione tra le centralità usando il coefficiente di correlazione di Pearson e i grafici di dispersione.
m = cbind(d,e,c,b)
cor(m, method="pearson")
## d e c b
## d 1.0000000 0.7196477 0.7126718 0.5902140
## e 0.7196477 1.0000000 0.6979078 0.2834826
## c 0.7126718 0.6979078 1.0000000 0.6657346
## b 0.5902140 0.2834826 0.6657346 1.0000000
pairs(m)
plot(d, e, xlab="Degree centrality", ylab="Eigenvector centrality")
abline(lm(e~d), col="red")
Scrivere in Shiny una applicazione che visualizza le misure di centralità calcolate sui nodi di una rete generica. L’utente:
L’applicazione visualizza la rete con i nodi di grandezza proporzionale al rispettivo valore della misura di centralità scelta. Il nodo con massimo valore di centralità viene visualizzato in rosso. La soluzione di può scaricare qui
Il paradosso degli amici è il fenomeno osservato per la prima volta dal sociologo Scott L. Feld in base al quale, in media:
Ho meno amici di quanti ne hanno i miei amici.
Interpretato su una rete (sociale), formalmente il paradosso afferma che la media dei gradi dei nodi
\[\mu_1 = \frac{\sum_i k_i}{n}\]
è sempre minore o uguale alla media dei gradi dei vicini dei nodi (o media dei gradi dei nodi sugli archi):
\[\mu_2 = \frac{\sum_{i,j} a_{i,j} k_j}{\sum_i k_i}\]
Mostrare, empiricamente, che la disuguaglianza \(\mu_1 \leq \mu_2\) vale sulla rete sociale dei delfini.
d = degree(g)
m1 = mean(d)
m2 = mean(d^2) / m1
m1
## [1] 5.129032
m2
## [1] 6.805031
Dimostrare formalmente la disuguaglianza \(\mu_1 \leq \mu_2\) e dire quando vale l’uguaglianza. Suggerimento: esprimere \(\mu_2\) in termini della media quadratica dei nodi e ricordare che la varianza di una distribuzione è la differenza tra la media quadratica e il quadrato della media della distribuzione.
Vale che:
\[\mu_2 = \frac{\sum_{i,j} a_{i,j} k_j}{\sum_i k_i} = \frac{\sum_j k_j \sum_i a_{i,j}}{\sum_i k_i} = \frac{\sum_j k_j \cdot k_j}{\sum_i k_i} = \frac{\langle k^2 \rangle}{\langle k \rangle}\]
e dunque:
\[\mu_2 - \mu_1 = \frac{\langle k^2 \rangle}{\langle k \rangle} - \langle k \rangle = \frac{\langle k^2 \rangle - \langle k \rangle^2}{\langle k \rangle} = \frac{\sigma^{2}}{\langle k \rangle} \geq 0\]
Dato che la varianza \(\sigma^2\) della distribuzione dei gradi dei nodi e la media \(\langle k \rangle\) sono quantità positive vale la disuguaglianza. In particolare vale che \(\mu_1 = \mu_2\) se e solo se la \(\sigma^2 = 0\) se e solo se la distribuzione è costante, ossia tutti i gradi dei nodi sono uguali.
Spiegare intuitivamente perché vale il paradosso degli amici.
Il fenomento è dovuto ai nodi hub, ossia quei nodi con grado elevato rispetto agli altri. In una rete di amicizia, tali nodi sono spesso amici di qualcuno (in quanto hanno molti amici), e dunque il loro grado compare nella sommatoria di \(\mu_2\) molte più volte del grado di un nodo meno popolare. Mentre la media \(\mu_1\) viene calcolata su tutti i nodi (presi una sola volta), la media \(\mu_2\) viene calcolata su un cambione pregiudizievole, in quanto gli hub compaiono più spesso. Questo determina l’inalzamento di \(\mu_2\) rispetto a \(\mu_1\). Infatti, se non ci sono disuguaglianze tra i gradi dei nodi, allora anche \(\mu_1 = \mu_2\).
Calcolare le misure di similarità locali basate sul coseno e sul coefficiente di correlazione di Pearson, nonché la misura di similarità globale, usando la rete sociale dei delfini. Identificare le coppie di delfini più simili rispetto alle misure calcolate. Studiare la correlazione tra le misure di similarità calcolate usando il coefficiente di correlazione e i grafici di dispersione.
A = get.adjacency(g, sparse=FALSE)
# cosine similarity
S1 = cosine(A)
# remove self-similarity
T1 = S1 + diag(-1, vcount(g))
# which are the most similar nodes?
which(T1 > 0.8 & T1 <= 1, arr.ind=TRUE)
## row col
## [1,] 12 5
## [2,] 7 6
## [3,] 6 7
## [4,] 14 10
## [5,] 5 12
## [6,] 10 14
## [7,] 32 23
## [8,] 23 32
S1[7,6]
## [1] 0.8164966
neighbors(g, 7)
## [1] 10 14 18 55 57 58
neighbors(g, 6)
## [1] 10 14 57 58
# Pearson similarity
S2 = cor(A, method="pearson")
# remove self-similarity
T2 = S2 + diag(-1, n)
# which are the most similar nodes?
which(T2 > 0.8 & T2 <= 1, arr.ind=TRUE)
## row col
## [1,] 12 5
## [2,] 7 6
## [3,] 6 7
## [4,] 5 12
## [5,] 32 23
## [6,] 23 32
S2[7,6]
## [1] 0.8022956
neighbors(g, 7)
## [1] 10 14 18 55 57 58
neighbors(g, 6)
## [1] 10 14 57 58
# correlation between local similarity measures
cor(as.vector(S1), as.vector(S2))
## [1] 0.9837139
plot(as.vector(S1), as.vector(S2), xlab="cosine", ylab = "Pearson")
# global similarity
I = diag(1, vcount(g));
# leading eigenvalue
l = eigen(A)$values[1]
# 85% of leading eigenvalue
alpha = 0.85 * 1/l
# global similarity
S3 = solve(I - alpha * A)
# correlation between local and global similarity measures
cor(as.vector(S1), as.vector(S3))
## [1] 0.7586525
plot(as.vector(S1), as.vector(S3), xlab="cosine", ylab = "Katz")
cor(as.vector(S2), as.vector(S3))
## [1] 0.7228262
plot(as.vector(S2), as.vector(S3), xlab="Pearson", ylab = "Katz")
Calcolare le comunità sulla rete dei delfini usando gli algoritmi leading.eigenvector.community
, fastgreedy.community
e edge.betweenness.community
. Visualizzare le comunità nel grafo e identificare eventuali differenze tra i vari algoritmi. Calcolare le comunità usando l’algoritmo ottimo optimal.community
. Calcolare la modularità delle soluzioni. Quale algoritmo approssimato fornisce la soluzione che si avvicina di più all’ottimo? Calcolare un clustering gerarchico con la funzione hclust
usando il coseno come misura di similarità tra i nodi e visualizzare il relativo dendrogramma.
coords = layout.fruchterman.reingold(g)
fgc = fastgreedy.community(g)
modularity(fgc)
## [1] 0.4954907
plot(fgc, g, layout=coords, vertex.label=NA, vertex.size=5)
ebc = edge.betweenness.community(g)
modularity(ebc)
## [1] 0.5193821
plot(ebc, g, layout=coords, vertex.label=NA, vertex.size=5)
lec = leading.eigenvector.community(g)
modularity(lec)
## [1] 0.4911989
plot(lec, g, layout=coords, vertex.label=NA, vertex.size=5)
# This method is computationally heavy
oc = optimal.community(g)
modularity(oc)
## [1] 0.5285194
plot(oc, g, layout=coords, vertex.label=NA, vertex.size=5)
# hierarchical clustering
A = get.adjacency(g, sparse=FALSE)
# cosine similarity
S = cosine(A)
# distance matrix
D = 1-S
# distance object
d = as.dist(D)
# average-linkage clustering method
cc = hclust(d, method = "average")
# plot dendrogram
plot(cc)
# cut dendrogram at 2 clusters
clusters = cutree(cc, k = 2)
# draw dendogram with red borders around the 2 clusters
clusters.list = rect.hclust(cc, k = 2, border="blue")
Scrivere in Shiny una applicazione che visualizza le comunità di una rete generica. L’utente:
L’applicazione visualizza la rete con le comunità evidenziate e la modularità della soluzione. La soluzione di può scaricare qui
Verificare che la rete è connessa. Calcolare le componenti biconnesse. Calcolarne il numero e isolare la più grande. Visualizzare il grafo con i nodi della bicomponente gigante colorati in rosso. Quali nodi rimangono fuori?
# is the graph connected?
is.connected(g)
## [1] TRUE
# compute biconnected components
bc = biconnected.components(g)
cl = bc$components
size = sapply(cl, length)
length(size)
## [1] 10
table(size)
## size
## 2 53
## 9 1
# highlight the largest bi-component
giant = cl[[which.max(size)]]
V(g)$color = "blue"
V(g)[giant]$color = "red"
plot(g, layout=coords, vertex.label=NA, vertex.size=5)
Trovare il grado di separazione (distanza media tra due nodi) e il diametro (distanza massima tra due nodi) del grafo. Visualizzare il grafo con i nodi e gli archi del diametro colorati in rosso. Produrre un istogramma con le distanze tra i nodi del grafo. Come sono distribuite le distanze?
# average distance (degree of separation)
average.path.length(g)
## [1] 3.356954
# maximum distance (diameter)
diameter(g)
## [1] 8
# highlight the diameter
d = get.diameter(g)
E(g)$color = "grey"
E(g)$width = 1
E(g, path=d)$color = "red"
E(g, path=d)$width = 2
V(g)$color = "white"
V(g)[d]$color = "red"
plot(g, layout=coords, vertex.label = NA, vertex.size=5)
# histogram of distances
paths = path.length.hist(g)$res
names(paths) = 1:length(paths)
barplot(paths / sum(paths), xlab="Distance", ylab="Frequency")
Studiare la distribuzione dei gradi dei nodi. Come si pone la media rispetto alla mediana e agli altri quartili? Calcolare l’indice di asimmetria (skewness) e di Gini della distribuzione. Studiare la concentrazione delle connessioni con la curva di Lorenz. Calcolare e visualizzare la CCDF in scala bi-logaritmica. Possiamo dire che la rete sociale dei delfini è scale-free?
d = degree(g)
# mean and median
summary(d)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 3.000 5.000 5.129 7.000 12.000
# skewness
skewness(d)
## [1] 0.2915325
# Gini
Gini(d)
## [1] 0.3250152
# Lorenz curve
lc = Lc(d, plot=TRUE)
#CCDF
P = rep(0, max(d))
for (i in 1:max(d)) P[i] = length(d[d >= i]) / length(d)
plot(1:max(d), P, log="xy", type = "b", xlab="Degree", ylab="CCDF")
Trovare il coefficiente di transitività della rete.
transitivity(g)
## [1] 0.3087757
Calcolare l’assortatività della rete per sesso e per grado.
# the subgraph of dolphins with known sex
h = induced.subgraph(g, V(g)[male | female])
# males and females of the new graph
male.h = V(h)$sex == "M"
female.h = V(h)$sex == "F"
# edges as a matrix
edge = get.edgelist(h)
# all first nodes of the edges
# each edge is considered twice since it is undirected
x = c(edge[,1], edge[,2])
# all second nodes of the edges
y = c(edge[,2], edge[,1])
# sex of all first nodes of the edges
sx = male.h[x]
# sex of all second nodes of the edges
sy = male.h[y]
# sex assortativity
# absolute modularity
abs.mod = modularity(h, membership=as.integer(male.h) + 1)
abs.mod
## [1] 0.1994156
# Pearson correlation coefficient, equivalent to relative modularity
rel.mod = cor(sx, sy)
rel.mod
## [1] 0.4014706
# maximum modularity
max.mod = abs.mod / rel.mod
max.mod
## [1] 0.4967129
# degree assortativity
d = degree(g)
edge = get.edgelist(g)
x = c(edge[,1], edge[,2])
y = c(edge[,2], edge[,1])
dx = d[x]
dy = d[y]
cor(dx, dy)
## [1] -0.04359403
Scrivere in Shiny una applicazione che prova diverse strategie di rimozione di nodi da una rete al fine di determinare qual è la più efficace nello scottenntere la rete (percolazione). Le strategie di rimozione sono: casuale, per grado, per autovettore, per vicinanza, per intermediazione. L’utente:
L’applicazione visualizza la rete risultante dopo aver rimosso un numero di nodi pari a quello specificato scelti in modo casuale oppure corrispondenti ai nodi più centrali rispetto alla misura scelta, evidenziando anche il numero di componenti connesse e la dimensione della componente più grande del grafo.
La soluzione di può scaricare qui