代码拉取完成,页面将自动刷新
capture program drop nwsimilar
program nwsimilar
syntax [anything(name=netname)] [, type(string) name(string) mode(string) xvars]
_nwsyntax `netname'
if "`mode'" == "" {
local mode = "both"
}
if "`type'" == "" {
local type = "pearson"
}
_opts_oneof "pearson matches jaccard hamming crossproduct" "type" "`type'" 6556
_opts_oneof "incoming outgoing both" "mode" "`mode'" 6556
if "`name'" == "" {
local name = "_similar"
}
nwvalidate `name'
local name = "`r(validname)'"
local dtype = 0
if "`mode'" == "incoming" {
local dtype = 1
}
if "`mode'" == "outgoing" {
local dtype = 2
}
nwtomatafast `netname'
if "`type'" == "pearson" {
qui nwcorrelate `netname', name(`name')
}
if "`type'" == "matches" {
nwset, mat(matches_similarity(`r(mata)', `dtype')) name(`name')
}
if "`type'" == "jaccard" {
nwset, mat(jaccard_similarity(`r(mata)', `dtype')) name(`name')
}
if "`type'" == "hamming" {
nwset, mat(hamming_similarity(`r(mata)', `dtype')) name(`name')
}
if "`type'" == "crossproduct" {
nwset, mat(hamming_similarity(`r(mata)', `dtype')) name(`name')
}
if "`xvars'" == "" {
nwload `name'
}
end
capture mata mata drop matches_similarity()
capture mata mata drop jaccard_similarity()
capture mata mata drop hamming_similarity()
capture mata mata drop crossproduct_similarity()
mata:
real matrix matches_similarity(real matrix net,real scalar dtype){
S = J(rows(net), cols(net), 0)
for(i = 1; i<= rows(S); i++){
for(j = 1; j<= cols(S); j++){
i_outvec = net[i,.]
i_invec = net[.,i]
j_outvec = net[j,.]
j_invec = net[.,j]
i_outvec[i] = 0
i_outvec[j] = 0
i_invec[i] = 0
i_invec[j] = 0
j_outvec[i] = 0
j_outvec[j] = 0
j_invec[i] = 0
j_invec[j] = 0
i_outvec = (i_outvec :!= 0)
j_outvec = (j_outvec :!= 0)
i_invec = (i_invec :!= 0)
j_invec = (j_invec :!= 0)
if (dtype == 0 ) {
S[i,j] = (sum(i_outvec :== j_outvec) + sum(i_invec :== j_invec) - 4) / ((cols(i_outvec) - 2) + (rows(i_invec) - 2))
}
if (dtype == 1 ) {
S[i,j] = (sum(i_invec :== j_invec) - 2) / (cols(i_outvec) - 2)
}
if (dtype == 2 ) {
S[i,j] = (sum(i_outvec :== j_outvec) - 2) / (rows(i_invec) - 2)
}
}
}
return(S)
}
real matrix jaccard_similarity(real matrix net,real scalar dtype){
S = J(rows(net), cols(net), 0)
for(i = 1; i<= rows(S); i++){
for(j = 1; j<= cols(S); j++){
i_outvec = net[i,.]
i_invec = net[.,i]
j_outvec = net[j,.]
j_invec = net[.,j]
i_outvec[i] = 0
i_outvec[j] = 0
i_invec[i] = 0
i_invec[j] = 0
j_outvec[i] = 0
j_outvec[j] = 0
j_invec[i] = 0
j_invec[j] = 0
i_outvec = (i_outvec :!= 0)
j_outvec = (j_outvec :!= 0)
i_invec = (i_invec :!= 0)
j_invec = (j_invec :!= 0)
if (dtype == 0 ) {
S[i,j] = (sum((i_outvec :== j_outvec) :* (i_outvec :!= 0)) + sum((i_invec :== j_invec) :* (i_invec :!= 0))) / ((sum(i_outvec:!=0)) + (sum(i_invec:!=0)))
}
if (dtype == 1 ) {
S[i,j] = (sum((i_invec :== j_invec) :* (i_invec:!=0))) / (sum((i_invec :+ j_invec) :!=0))
}
if (dtype == 2 ) {
S[i,j] = (sum((i_outvec :== j_outvec) :* (i_outvec:!=0))) / (sum((i_outvec :+ j_outvec):!=0))
}
}
}
return(S)
}
real matrix hamming_similarity(real matrix net,real scalar dtype){
S = J(rows(net), cols(net), 0)
for(i = 1; i<= rows(S); i++){
for(j = 1; j<= cols(S); j++){
i_outvec = net[i,.]
i_invec = net[.,i]
j_outvec = net[j,.]
j_invec = net[.,j]
i_outvec[i] = 0
i_outvec[j] = 0
i_invec[i] = 0
i_invec[j] = 0
j_outvec[i] = 0
j_outvec[j] = 0
j_invec[i] = 0
j_invec[j] = 0
i_outvec = (i_outvec :!= 0)
j_outvec = (j_outvec :!= 0)
i_invec = (i_invec :!= 0)
j_invec = (j_invec :!= 0)
if (dtype == 0 ) {
S[i,j] = (sum(i_outvec :== j_outvec) + sum(i_invec :== j_invec))
}
if (dtype == 1 ) {
S[i,j] = (sum(i_invec :== j_invec))
}
if (dtype == 2 ) {
S[i,j] = (sum(i_outvec :== j_outvec))
}
}
}
return(S)
}
real matrix crossproduct_similarity(real matrix net,real scalar dtype){
S = J(rows(net), cols(net), 0)
for(i = 1; i<= rows(S); i++){
for(j = 1; j<= cols(S); j++){
i_outvec = net[i,.]
i_invec = net[.,i]
j_outvec = net[j,.]
j_invec = net[.,j]
i_outvec[i] = 0
i_outvec[j] = 0
i_invec[i] = 0
i_invec[j] = 0
j_outvec[i] = 0
j_outvec[j] = 0
j_invec[i] = 0
j_invec[j] = 0
i_outvec = (i_outvec :!= 0)
j_outvec = (j_outvec :!= 0)
i_invec = (i_invec :!= 0)
j_invec = (j_invec :!= 0)
if (dtype == 0 ) {
S[i,j] = (sum(i_outvec :* j_outvec) + sum(i_invec :* j_invec))
}
if (dtype == 1 ) {
S[i,j] = (sum(i_invec :* j_invec))
}
if (dtype == 2 ) {
S[i,j] = (sum(i_outvec :* j_outvec))
}
}
}
return(S)
}
end
*! v1.5.0 __ 17 Sep 2015 __ 13:09:53
*! v1.5.1 __ 17 Sep 2015 __ 14:54:23
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。