さまざまなジョブ間のモビリティを表すマトリックスがあります。
 jobdat <- matrix(c(
           295,  20,   0,    0,    0,    5,    7,
           45,   3309, 15,   0,    0,    0,    3,
           23,   221,  2029, 5,    0,    0,    0,
           0,    0,    10,   100,  8,    0,    3,
           0,    0,    0,    0,    109,  4,    4,
           0,    0,    0,    0,    4,    375,  38,
           0,    18,   0,    0,    4,    26,   260), 
           nrow = 7, ncol = 7, byrow = TRUE,
           dimnames = list(c("job 1","job 2","job 3","job 4","job 5","job 6","job 7"),
                c("job 1","job 2","job 3","job 4","job 5","job 6","job 7")))
これは、ソーシャル ネットワーク分析では、重み付けされた有向隣接行列として扱われます。ネットワークの方向は行から列です。したがって、モビリティは、ジョブの行からジョブの列に移動することとして定義されます。別の会社で同じ仕事に変わる可能性があるので、対角線は意味があります。
分析の一環として、ジョブ 1、ジョブ 5、およびジョブ 7 で構成されるサブマトリックスを選択します。
work.list <- c(1,5,7)
jobpick_wrong <- jobdat[work.list,work.list]
ただし、これはこれら 3 つのジョブ間の直接的な関係を示すだけです。私が必要とするのはこれです:
jobpick_right <- matrix(c(
          295,  20,   0,    5,    7,
          45,   3309, 0,    0,    3,
          0,    0,    109,  4,    4,
          0,    0,    4,    375,  38,
          0,    18,   4,    26,   260),
          nrow = 5, ncol = 5, byrow = TRUE,
          dimnames = list(c("job 1","job 2","job 5","job 6","job 7"),
                    c("job 1","job 2","job 5","job 6","job 7")))
ここでは、ジョブ 2 と 6 も含まれています。これらの 2 つのジョブは、ジョブ 1、5、または 7 のいずれかと直接関係があるからです。一方、ジョブ 3 と 4 は、ジョブ 1、5、または 7 とは関係がないため除外されています。
どうすればいいのかわかりません。たぶん、どこにでも行くためにそれを igraph-object に変換する必要がありますか?
net           <- graph.adjacency(jobdat, mode = "directed", weighted = TRUE)
そして、igraph パッケージの ego/neighborhood-function を使用することもできますか? しかし、どうすればいいのか本当にわかりません。または、これが最善の方法である場合。
お時間をいただきありがとうございます。
エミール・ベグトラップ=ブライト
追加の質問:
別のステップが必要であることが判明しましたが、aichao による回答は、尋ねられた質問に最適です。3 つの「関心のあるジョブ」、この例ではジョブ 1、5、7 に関連するジョブを含む work.list が作成されている場合。次に、実際のデータでは、混乱の量が別のステップを望ましいものにします。つまり、関心のある 3 つのジョブとの間の直接的な関係のみを保持し、他のジョブ間の関係をゼロに設定します。
上記のデータはこれをうまく表していないので、これを実証するために上記のバージョンを作成しました。
jobdat <- matrix(c(
1,   0,   1,   0,   0,   0,   0,
1,   1,   1,   0,   0,   0,   0,
1,   1,   1,   0,   0,   0,   0,
0,   0,   0,   1,   0,   0,   0,
0,   0,   0,   0,   1,   0,   0,
0,   0,   0,   0,   0,   1,   0,
0,   0,   0,   0,   0,   0,   1
           ), 
           nrow = 7, ncol = 7, byrow = TRUE,
           dimnames = list(c("job 1","job 2","job 3","job 4","job 5","job 6","job 7"),
                c("job 1","job 2","job 3","job 4","job 5","job 6","job 7")))
aichaos ソリューションを使用して:
work.list <- sort(unique(unlist(lapply(work.list, function(x) which(jobdat[x,] != 0)))))
次に、これを取得します。
jobdat[work.list,work.list]
#          job 1 job 2 job 3 job 5 job 7
#    job 1     1     0     1     0     0
#    job 2     1     1     1     0     0
#    job 3     1     1     1     0     0
#    job 5     0     0     0     1     0
#    job 7     0     0     0     0     1
ただし、ジョブ 2 とジョブ 3 の間の関係は無関係であり、関心のある関係をあいまいにするだけです。
jobdat.result <- matrix(c(
1,     0,     1,     0,     0,
1,     1,     0,     0,     0,
1,     0,     1,     0,     0,
0,     0,     0,     1,     0,
0,     0,     0,     0,     1
           ), 
           nrow = 5, ncol = 5, byrow = TRUE,
           dimnames = list(c("job 1","job 2","job 3","job 5","job 7"),
                c("job 1","job 2","job 3","job 5","job 7")))
job.dat.result では、ジョブ 3 とジョブ 2 の間の関係は行方向と列方向の両方で削除されていますが、これら 2 つのジョブと対象の 3 つのジョブの間の関係は維持されています。理想的には、ジョブ 2 とジョブ 3 の対角線もゼロにするかどうかを選択できる必要があります。しかし、ほとんどの場合、すべてのジョブで対角線をゼロに設定するので、これは必須ではありません。しかし、他に何もないとしても、これの論理をより高いレベルで理解することは素晴らしいことです.
私が達成しようとしているのは、とりわけ、次のようなサークルグラムです。
したがって、同数の単純さが重要です。図は次のように再現されます。
library(circlize)
segmentcircle <- jobdat  
diag(segmentcircle) <- 0
df.c <- get.data.frame(graph.adjacency(segmentcircle,weighted=TRUE))
colour <-  brewer.pal(ncol(segmentcircle),"Set1")
chordDiagram(x = df.c, 
  grid.col = colour, 
  transparency = 0.2,
             directional = 1, symmetric=FALSE,
             direction.type = c("arrows", "diffHeight"), diffHeight  = -0.065,
             link.arr.type = "big.arrow", 
             # self.link=1
             link.sort = TRUE, link.largest.ontop = TRUE,
             link.border="black",
             # link.lwd = 2, 
             # link.lty = 2
             )
    