====== Identifying groups of networks ======
''setwd("D:/Users/Hyo/Cs-Kant/CS/Classes/sna_examples/sna_in_r")''
# Network's characteristics and subgroups
library(sna)
# Faux Magnolia High School data
library(ergm)
data(faux.magnolia.high)
summary(faux.magnolia.high)
fmh <- as.sociomatrix(faux.magnolia.high)
gplot(fmh, vertex.cex=0.5, arrowhead.cex=0.5)
{{fmh.png?400}}
round(gden(fmh),4)
[1] 9e-04 = 0.00091
**transivity** \\
fmh2 <- fmh %*% fmh
(denom <- sum(fmh2)-sum(diag(fmh2)))
(num <- sum(fmh2 * fmh))
round(num/denom,3)
round(gtrans(fmh),3)
> fmh2 <- fmh %*% fmh
> (denom <- sum(fmh2)-sum(diag(fmh2)))
[1] 3642
> (num <- sum(fmh2 * fmh))
[1] 1014
> round(num/denom,3)
[1] 0.278
> round(gtrans(fmh),3)
[1] 0.278
**reciprocity** \\
# knoke.infor network is given in Chapter 2, Section 1
library(sna)
knoke.infor <- as.matrix(read.table("knoke-infor.txt",header=T))
rownames(knoke.infor) <- colnames(knoke.infor)
(num <- sum(knoke.infor * t(knoke.infor)))
(denom <- sum(knoke.infor))
round(num/denom,3)
round(grecip(knoke.infor, measure="edgewise"),3)
triad census
{{triad_census.jpg?500}}
# knoke.money network
knoke.money <- as.matrix(read.table("knoke-money.txt",header=T))
rownames(knoke.money) <- colnames(knoke.money)
# dyad and triad patterns in knoke-infor and knoke-money
dyad.census(knoke.infor)
dyad.census(knoke.money)
triad.census(knoke.infor)
triad.census(knoke.money)
> dyad.census(knoke.infor)
Mut Asym Null
[1,] 17 15 13
> dyad.census(knoke.money)
Mut Asym Null
[1,] 1 20 24
> triad.census(knoke.infor)
003 012 102 021D 021U 021C 111D 111U 030T 030C 201 120D 120U 120C 210 300
[1,] 3 13 12 1 13 3 10 4 7 0 14 4 2 1 24 9
> triad.census(knoke.money)
003 012 102 021D 021U 021C 111D 111U 030T 030C 201 120D 120U 120C 210 300
[1,] 20 48 2 10 13 7 1 1 14 0 0 3 0 1 0 0
component.dist(knoke.money)
{{knoke_money.png}}
- COUN: county government
- COMM: chamber of commerce
- EDUC: board of education
- INDU: Industry development agency
- MAYR: Mayor
- WRO: Women Right Organization group
- NEWS: Newspaper
- WAY: United Way (private organization)
- WELF: Welfare
- WEST: West group (private organization)
> component.dist(knoke.money)
$membership
[1] 1 2 3 4 5 6 7 3 3 8
$csize
[1] 1 1 3 1 1 1 1 1
$cdist
[1] 7 0 1 0 0 0 0 0 0 0
====== Identifying sub-group ======
library(sna)
# Faux Magnolia High School data (Continued)
library(ergm)
data(faux.magnolia.high)
summary(faux.magnolia.high)
fmh<-as.sociomatrix(faux.magnolia.high)
gplot(fmh, vertex.cex=.5, arrowhead.cex=.3)
round(gden(fmh),4)
round(gtrans(fmh),3)
components(fmh)
fmh.comp = component.dist(fmh)
table(fmh.comp$csize)
head(fmh.comp$membership,100)
grp2 <- (1:1461)[fmh.comp$membership=="2"]
str(grp2)
{{fmh_components.png}}
> round(gden(fmh),4)
[1] 9e-04
> round(gtrans(fmh),3)
[1] 0.278
Warning message:
In gtrans(fmh) :
gtrans called with use.adjacency=TRUE, but your data looks
too large for that to work well.
Overriding to edgelist method.
> components(fmh)
[1] 661
> fmh.comp = component.dist(fmh)
> table(fmh.comp$csize)
1 2 3 4 5 6 7 8 9 11 12 19 23 439
524 64 29 11 12 4 7 4 1 1 1 1 1 1
> head(fmh.comp$membership,100)
[1] 1 2 2 2 2 3 2 4 5 6 7 8 9 2 10 2 11 12 11 13 2 14 15 16 2 17 18 19 20 21
[31] 22 23 24 25 26 27 2 2 28 29 2 30 31 32 33 34 2 35 36 2 37 38 2 39 40 41 42 43 44 45
[61] 2 46 2 47 2 48 49 11 2 38 8 2 2 50 51 52 53 11 54 55 56 11 2 57 58 2 59 60 22 11
[91] 61 2 62 63 64 65 22 66 67 68
> grp2 <- (1:1461)[fmh.comp$membership=="2"]
> str(grp2)
int [1:439] 2 3 4 5 7 14 16 21 25 37 ...
>
fmh.clique <- clique.census(fmh, clique.comembership="bysize")
names(fmh.clique)
str(fmh.clique$cliques)
core.list <- c(122,183,530,1143,1160) # fmh.clique$cliques[[5]]
fmh.comp$membership[core.list]
fmh[core.list,core.list]
summary(sort(geodist(fmh)$gdist[122,])[2:439])[-4]
# end
> fmh.clique <- clique.census(fmh, clique.comembership="bysize")
> names(fmh.clique)
[1] "clique.count" "clique.comemb" "cliques"
> str(fmh.clique$cliques)
List of 5
$ :List of 524
..$ : int 1457
..$ : int 1456
..$ : int 1455
..$ : int 1451
..$ : int 1449
..$ : int 1448
..$ : int 1443
..$ : int 1440
..$ : int 1438
..$ : int 1437
..$ : int 1436
..$ : int 1435
..$ : int 1431
..$ : int 1427
..$ : int 1426
..$ : int 1425
..$ : int 1421
..$ : int 1418
..$ : int 1416
..$ : int 1413
..$ : int 1412
..$ : int 1410
..$ : int 1408
..$ : int 1407
..$ : int 1403
..$ : int 1402
..$ : int 1399
..$ : int 1394
..$ : int 1393
..$ : int 1387
..$ : int 1386
..$ : int 1384
..$ : int 1380
..$ : int 1379
..$ : int 1374
..$ : int 1373
..$ : int 1371
..$ : int 1367
..$ : int 1364
..$ : int 1362
..$ : int 1359
..$ : int 1351
..$ : int 1350
..$ : int 1347
..$ : int 1343
..$ : int 1334
..$ : int 1329
..$ : int 1327
..$ : int 1326
..$ : int 1325
..$ : int 1321
..$ : int 1320
..$ : int 1319
..$ : int 1318
..$ : int 1315
..$ : int 1314
..$ : int 1311
..$ : int 1310
..$ : int 1307
..$ : int 1306
..$ : int 1305
..$ : int 1304
..$ : int 1303
..$ : int 1301
..$ : int 1297
..$ : int 1296
..$ : int 1294
..$ : int 1289
..$ : int 1286
..$ : int 1278
..$ : int 1276
..$ : int 1275
..$ : int 1273
..$ : int 1268
..$ : int 1259
..$ : int 1257
..$ : int 1253
..$ : int 1249
..$ : int 1247
..$ : int 1245
..$ : int 1241
..$ : int 1236
..$ : int 1235
..$ : int 1234
..$ : int 1233
..$ : int 1229
..$ : int 1225
..$ : int 1224
..$ : int 1223
..$ : int 1219
..$ : int 1218
..$ : int 1216
..$ : int 1214
..$ : int 1213
..$ : int 1211
..$ : int 1207
..$ : int 1200
..$ : int 1199
..$ : int 1198
.. [list output truncated]
$ :List of 626
..$ : int [1:2] 1299 1424
..$ : int [1:2] 1279 1382
..$ : int [1:2] 1265 1417
..$ : int [1:2] 1254 1258
..$ : int [1:2] 1147 1239
..$ : int [1:2] 1130 1372
..$ : int [1:2] 1119 1452
..$ : int [1:2] 1203 1452
..$ : int [1:2] 1102 1138
..$ : int [1:2] 1102 1119
..$ : int [1:2] 1002 1292
..$ : int [1:2] 930 1398
..$ : int [1:2] 917 930
..$ : int [1:2] 977 1406
..$ : int [1:2] 977 1011
..$ : int [1:2] 898 1011
..$ : int [1:2] 884 975
..$ : int [1:2] 909 1108
..$ : int [1:2] 865 1108
..$ : int [1:2] 841 958
..$ : int [1:2] 838 1461
..$ : int [1:2] 1196 1357
..$ : int [1:2] 770 1332
..$ : int [1:2] 748 911
..$ : int [1:2] 737 1036
..$ : int [1:2] 713 1352
..$ : int [1:2] 785 821
..$ : int [1:2] 711 821
..$ : int [1:2] 666 867
..$ : int [1:2] 664 679
..$ : int [1:2] 643 759
..$ : int [1:2] 616 695
..$ : int [1:2] 608 1390
..$ : int [1:2] 608 1013
..$ : int [1:2] 602 1141
..$ : int [1:2] 591 966
..$ : int [1:2] 587 644
..$ : int [1:2] 579 654
..$ : int [1:2] 576 1290
..$ : int [1:2] 556 561
..$ : int [1:2] 555 844
..$ : int [1:2] 551 964
..$ : int [1:2] 537 992
..$ : int [1:2] 534 1238
..$ : int [1:2] 534 988
..$ : int [1:2] 1252 1256
..$ : int [1:2] 529 1422
..$ : int [1:2] 520 848
..$ : int [1:2] 519 546
..$ : int [1:2] 514 1037
..$ : int [1:2] 504 1283
..$ : int [1:2] 500 984
..$ : int [1:2] 949 1244
..$ : int [1:2] 652 1244
..$ : int [1:2] 856 1447
..$ : int [1:2] 633 1244
..$ : int [1:2] 633 944
..$ : int [1:2] 633 856
..$ : int [1:2] 508 1244
..$ : int [1:2] 496 1447
..$ : int [1:2] 628 1058
..$ : int [1:2] 486 637
..$ : int [1:2] 486 628
..$ : int [1:2] 627 1168
..$ : int [1:2] 455 1128
..$ : int [1:2] 440 1007
..$ : int [1:2] 440 583
..$ : int [1:2] 430 1331
..$ : int [1:2] 430 864
..$ : int [1:2] 429 710
..$ : int [1:2] 417 1340
..$ : int [1:2] 1055 1146
..$ : int [1:2] 407 1055
..$ : int [1:2] 1059 1444
..$ : int [1:2] 639 1146
..$ : int [1:2] 639 1059
..$ : int [1:2] 407 1038
..$ : int [1:2] 445 1227
..$ : int [1:2] 445 918
..$ : int [1:2] 404 445
..$ : int [1:2] 403 580
..$ : int [1:2] 399 1328
..$ : int [1:2] 1277 1453
..$ : int [1:2] 1337 1453
..$ : int [1:2] 1269 1337
..$ : int [1:2] 387 1453
..$ : int [1:2] 386 1348
..$ : int [1:2] 617 1182
..$ : int [1:2] 370 1182
..$ : int [1:2] 1189 1454
..$ : int [1:2] 1189 1428
..$ : int [1:2] 995 1428
..$ : int [1:2] 995 1285
..$ : int [1:2] 369 1189
..$ : int [1:2] 368 459
..$ : int [1:2] 366 1139
..$ : int [1:2] 796 839
..$ : int [1:2] 362 839
..$ : int [1:2] 1004 1181
.. [list output truncated]
$ :List of 106
..$ : int [1:3] 809 1196 1360
..$ : int [1:3] 666 1115 1355
..$ : int [1:3] 666 1112 1355
..$ : int [1:3] 664 1266 1370
..$ : int [1:3] 531 888 1252
..$ : int [1:3] 478 593 627
..$ : int [1:3] 478 494 593
..$ : int [1:3] 768 1007 1376
..$ : int [1:3] 573 678 1333
..$ : int [1:3] 541 553 1445
..$ : int [1:3] 541 553 1423
..$ : int [1:3] 161 653 1172
..$ : int [1:3] 109 336 1232
..$ : int [1:3] 94 108 1293
..$ : int [1:3] 978 1201 1430
..$ : int [1:3] 93 588 1430
..$ : int [1:3] 686 721 804
..$ : int [1:3] 275 797 1177
..$ : int [1:3] 142 804 899
..$ : int [1:3] 64 686 721
..$ : int [1:3] 1071 1085 1369
..$ : int [1:3] 59 1176 1375
..$ : int [1:3] 916 928 1039
..$ : int [1:3] 31 97 377
..$ : int [1:3] 78 375 876
..$ : int [1:3] 78 283 876
..$ : int [1:3] 19 68 419
..$ : int [1:3] 19 68 375
..$ : int [1:3] 680 859 1383
..$ : int [1:3] 680 859 1378
..$ : int [1:3] 859 1069 1302
..$ : int [1:3] 680 859 1069
..$ : int [1:3] 263 1000 1378
..$ : int [1:3] 263 615 1000
..$ : int [1:3] 996 1217 1404
..$ : int [1:3] 940 962 1188
..$ : int [1:3] 919 1009 1316
..$ : int [1:3] 786 788 906
..$ : int [1:3] 584 1095 1322
..$ : int [1:3] 568 1053 1054
..$ : int [1:3] 568 718 1053
..$ : int [1:3] 550 749 991
..$ : int [1:3] 550 650 749
..$ : int [1:3] 552 562 752
..$ : int [1:3] 517 1204 1255
..$ : int [1:3] 501 744 1345
..$ : int [1:3] 490 630 1057
..$ : int [1:3] 483 765 1150
..$ : int [1:3] 480 512 764
..$ : int [1:3] 471 745 857
..$ : int [1:3] 471 632 857
..$ : int [1:3] 769 1129 1391
..$ : int [1:3] 449 769 1391
..$ : int [1:3] 395 589 743
..$ : int [1:3] 347 1312 1429
..$ : int [1:3] 299 323 603
..$ : int [1:3] 299 323 408
..$ : int [1:3] 374 396 861
..$ : int [1:3] 279 374 780
..$ : int [1:3] 396 692 861
..$ : int [1:3] 279 374 396
..$ : int [1:3] 278 409 1175
..$ : int [1:3] 274 1381 1389
..$ : int [1:3] 325 1110 1450
..$ : int [1:3] 325 833 1450
..$ : int [1:3] 227 439 1459
..$ : int [1:3] 216 1312 1429
..$ : int [1:3] 487 650 749
..$ : int [1:3] 487 630 991
..$ : int [1:3] 410 1356 1420
..$ : int [1:3] 172 410 1356
..$ : int [1:3] 528 558 1056
..$ : int [1:3] 528 558 980
..$ : int [1:3] 528 558 622
..$ : int [1:3] 170 528 558
..$ : int [1:3] 846 942 1152
..$ : int [1:3] 727 846 1152
..$ : int [1:3] 158 906 1019
..$ : int [1:3] 779 1019 1226
..$ : int [1:3] 158 779 1019
..$ : int [1:3] 141 817 941
..$ : int [1:3] 133 1178 1281
..$ : int [1:3] 157 195 1178
..$ : int [1:3] 157 195 926
..$ : int [1:3] 133 157 1178
..$ : int [1:3] 128 1354 1365
..$ : int [1:3] 122 183 1414
..$ : int [1:3] 122 722 1143
..$ : int [1:3] 183 559 1414
..$ : int [1:3] 150 1153 1261
..$ : int [1:3] 150 356 1061
..$ : int [1:3] 92 766 1349
..$ : int [1:3] 92 1121 1349
..$ : int [1:3] 92 1121 1267
..$ : int [1:3] 92 766 1267
..$ : int [1:3] 264 1284 1342
..$ : int [1:3] 72 301 1458
..$ : int [1:3] 72 301 784
..$ : int [1:3] 72 264 1284
.. [list output truncated]
$ :List of 15
..$ : int [1:4] 240 767 1300 1401
..$ : int [1:4] 535 646 765 947
..$ : int [1:4] 535 646 724 765
..$ : int [1:4] 290 836 1187 1335
..$ : int [1:4] 251 688 1087 1419
..$ : int [1:4] 487 729 749 991
..$ : int [1:4] 487 492 729 991
..$ : int [1:4] 122 1143 1160 1415
..$ : int [1:4] 285 425 590 817
..$ : int [1:4] 121 296 677 794
..$ : int [1:4] 121 291 296 677
..$ : int [1:4] 114 890 1061 1261
..$ : int [1:4] 114 150 1061 1261
..$ : int [1:4] 425 590 817 941
..$ : int [1:4] 83 425 590 817
$ :List of 1
..$ : int [1:5] 122 183 530 1143 1160
> core.list <- c(122,183,530,1143,1160) # fmh.clique$cliques[[5]]
> fmh.comp$membership[core.list]
[1] 2 2 2 2 2
> fmh[core.list,core.list]
122 183 530 1143 1160
122 0 1 1 1 1
183 1 0 1 1 1
530 1 1 0 1 1
1143 1 1 1 0 1
1160 1 1 1 1 0
> summary(sort(geodist(fmh)$gdist[122,])[2:439])[-4]
Min. 1st Qu. Median 3rd Qu. Max.
1 11 14 17 25
>
위의 ''str(fmh.clique$cliques)'' 는\\
fmh.clique 라는 데이터를
clique.census(fmh, . . . .)를 이용하여 생성하고
거기서 발견되는 클리크(cliques)들을 나열해 본것.
아웃풋은 하나로 이루어진 클리크는 524개
둘로 이루어진 클리크는 626개
셋으로 이루어진 클리크는 106개
넷으로 이루어진 클리크는 15개
그리고 다섯으로 이루어진 클리크는 1개가 있다는 것 (list of 1)
그 멤버들은 122, 183, 530, 1143, 1160 이다.
Clique 정의에 따라서 이들은 maximal complete link (모두 연결되어 있는) 관계의 집단이다.
{{fmh.clique.5members.png?300}}
s = matrix(0,5,5)
edge.list = matrix ( c(1,2, 1,3, 2,4, 2,5, 3,4, 3,5, 4,5, 5,4), byrow=T, ncol=2)
s[edge.list]=1
s
rownames(s)<-c("a", "b", "c", "d", "e")
colnames(s)<-c("a", "b", "c", "d", "e")
> s
> s = matrix(0,5,5)
> edge.list = matrix ( c(1,2, 1,3, 2,4, 2,5, 3,4, 3,5, 4,5, 5,4), byrow=T, ncol=2)
> s[edge.list] = 1
> s
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 1 0 0
[2,] 0 0 0 1 1
[3,] 0 0 0 1 1
[4,] 0 0 0 0 1
[5,] 0 0 0 1 0
{{network_s.png?400}}
눈으로 봐서 a를 중심으로 좌우동형이므로 b, c와 d,e는 각각 등치 (등가)라고 할 수 있다. 이를 수식으로 구하기 위한 접근 방법으로는 연결을 1, 비연결을 0으로 한 각 노드(점) 간의 거리를 구하여 거리가 가까운 것들을 모아 놓으면 될 것이다. 가장 흔한 예가 Hamming distance:
* see [[yt>P02mJhS9qQ4]]
예:
library(sna)
set.seed(123)
p1<-runif(10,0,1)
p2<-runif(10,0,1)
G1<-rgraph(10,tprob=sapply(p1,rep,10))
G2<-rgraph(10,tprob=t(sapply(p2,rep,10)))
G<-G1*G2
G
hamming.G=sedist(G,method="hamming")
cluster <- equiv.clust(G, method="hamming", cluster.method="complete")
b.mdoel <- blockmodel(G, cluster, h=4.5)
b.model
plot(b.model)
{{cluster.dendrogram.png?400}}
> b.mdoel <- blockmodel(G, cluster, h=4.5)
> b.model
Network Blockmodel:
Block membership:
1 2 3 4 5 6 7 8 9 10
1 2 1 3 4 1 1 3 4 5
Reduced form blockmodel:
Block 1 Block 2 Block 3 Block 4 Block 5
Block 1 0.0 0 0.875 0.25 0.5
Block 2 0.5 NaN 0.000 0.50 1.0
Block 3 0.0 0 0.500 0.25 0.5
Block 4 0.0 1 0.000 0.50 0.0
Block 5 0.0 0 1.000 1.00 NaN
> plot(b.model)
{{blockmodel.png?400}}