
Aggregate a coupling or co-citation network at the level of entities
Source:R/entity_network.R
entity_network.RdBuilds the edges of a coupling (or co-citation) network whose nodes are
not documents but entities that aggregate documents: authors, journals,
institutions, countries... It is not a new measure of proximity: it takes
the measures of biblio_coupling() (or of biblio_cocitation()) and
computes them for entities instead of documents. Since an entity
publishes several documents, it can cite the same reference several
times, and the function takes this into account: citing a reference ten
times is more significant than citing it once. The counts are combined
with the minimum rule of Zhao and Strotmann (2008)
.
Arguments
- dt
A data frame or a
data.tableof direct citations, one row per link between a citing document and a cited reference. It is not modified.- source
Character scalar. The column of the citing documents. Needed to count the documents, not to define the nodes (except for
network = "cocitation", see the details).- ref
Character scalar. The column of the cited references.
- entity
Character scalar. The column of the entities that are the nodes of the network (authors, journals, institutions...). With
network = "coupling"it describes the citing documents (source); withnetwork = "cocitation"it describes the cited references (ref). A document can appear with several entities (one row per entity and reference).- network
"coupling"(default): the entities are linked when their documents cite the same references."cocitation": they are linked when their references are cited by the same documents.- method
The weighting method, one of
"angle"(default),"strength","similarity","jaccard"and"vladutz": see the details, andbiblio_coupling()for their document-level versions.- weight_threshold
Number. The minimum number of shared references for two entities to be linked (1 by default). With large entities such as journals, a higher value is advisable.
- output_in_character
Logical. If
TRUE,fromandtoare character columns (FALSEby default for this function: they keep the type of the entity column).
Value
A data.table with one row per pair of entities: from, to,
the weight, the original identifiers in Source and Target, and the
Weighting_method (the method). Each pair appears once, with Source < Target.
Details
Write \(C_{Aj}\) for the number of times entity \(A\) cites reference
\(j\) (the number of its documents citing \(j\)), \(N\) for the
number of citing documents in the table, \(f_j\) for the number of
documents citing \(j\), and \(L(A) = \sum_j C_{Aj}\) for the
total number of citations made by \(A\). Write also
\(m_{AB}(g) = \sum_{j} \min(C_{Aj}, C_{Bj}) \, g_j\), the overlap of the
two entities, with the references weighted by \(g_j\). According to
method, the weight of the tie between \(A\) and \(B\) is
"angle", with \(g_j = 1\): $$w_{AB} = \frac{m_{AB}(1)}{\sqrt{L(A) \, L(B)}}$$"strength", with \(g_j = \log(N / f_j)\): $$w_{AB} = \frac{m_{AB}(g)}{L(A) \, L(B)}$$"similarity", with \(g_j = \log(N / f_j)\) and \(S(A) = \sum_j C_{Aj} \log(N / f_j)\): $$w_{AB} = \frac{m_{AB}(g)}{\sqrt{S(A) \, S(B)}}$$"jaccard", with \(g_j = 1\): $$w_{AB} = \frac{m_{AB}(1)}{L(A) + L(B) - m_{AB}(1)}$$ which is the ratio of the sum of the minima to the sum of the maxima of the counts (the weighted Jaccard index);"vladutz", with \(g_j = 1 / f_j\): $$w_{AB} = \frac{4 \, m_{AB}(g)}{L(A) + L(B)}$$
The sums run over the references cited by both entities, and \(L\), \(S\)
over all the references of the entity. The minimum of the two counts is
the number of times the two entities cite the reference "together"
(Zhao and Strotmann 2008)
. The package follows the paper for
the minimum rule with the coupling angle and strength; the other methods
are the same extension, applied to the measures of
coupling_similarity(), coupling_jaccard() and coupling_vladutz()
(the similarity is still bounded by 1, since
\(\min(C_{Aj}, C_{Bj}) \leq \sqrt{C_{Aj} C_{Bj}}\) and by the
Cauchy-Schwarz inequality). With a single citation per entity and
reference, each method gives back the document-level measure. \(f_j\)
counts citing documents, not entities, so that a document with several
authors is not counted several times. References cited by a single entity
cannot create a tie and are ignored in the overlaps, but they count in
\(L\).
Co-citation. With network = "cocitation", the roles of source and
ref are swapped, as in biblio_cocitation(): the nodes are the entities
of the cited references, and the entity column must describe ref
(the author or the journal of the cited reference). Two entities are
co-cited when documents cite references of both. The formulas above apply
with the roles exchanged: \(C_{Aj}\) is the number of references of
\(A\) cited by document \(j\).
The weight_threshold applies to the number of references shared by two
entities (each counted once, whatever the number of times it is cited).
The table of the user is not modified, rows with a missing identifier are
dropped with a warning, and a zero-row table is returned, with a warning, if no reference
is shared (or if no pair reaches weight_threshold). The memory warning
of coupling_strength() applies.
Why use it in research
Coupling at the level of authors (author bibliographic coupling,
(Zhao and Strotmann 2008)
), journals or institutions maps
who relies on the same literature, whatever the documents they publish.
With network = "cocitation", it maps which authors, journals or
institutions are cited together, as in author co-citation analysis. It is
a way to study the structure of a discipline through its journals or its
authors, with fewer and denser nodes than the document-level network.
Because entities are aggregates of documents, check that they are not too
heterogeneous (a generalist journal citing everything is coupled with
everyone), and that the number of documents per entity is large enough to
give a stable bibliography. An article with several authors appears once
for each of its authors: the same document then contributes to several
entities.
Intuition
Think of an entity (say a journal) as one big bibliography made of the
bibliographies of all its documents, in which a reference appears as many
times as the entity's documents cite it. Two journals are close when their
big bibliographies overlap. Overlap is measured reference by reference by
the smaller of the two counts: if journal A cites a reference 10 times and
journal B twice, they share it twice (B is the limit). The methods then
differ in what they do with these overlaps, as their document-level
counterparts: "angle" only counts them and normalises by the sizes of the
two big bibliographies; "strength" counts a shared rare reference more
than a shared classic; "similarity" does the same but normalises by the
"informational size" of each big bibliography, to give a cosine that
cannot exceed 1; "jaccard" compares the overlap with the union of the
two big bibliographies; "vladutz" discounts popular references steeply.
References
Zhao D, Strotmann A (2008). “Author Bibliographic Coupling: Another Approach to Citation-Based Author Knowledge Network Analysis.” Proceedings of the American Society for Information Science and Technology, 45(1), 1–10. https://asistdl.onlinelibrary.wiley.com/doi/full/10.1002/meet.2008.1450450292.
Examples
library(biblionetwork)
Ref_stagflation$Citing_ItemID_Ref <- as.character(Ref_stagflation$Citing_ItemID_Ref)
# merging the references data with the citing author information in Nodes_stagflation
entity_citations <- merge(Ref_stagflation,
Nodes_stagflation,
by.x = "Citing_ItemID_Ref",
by.y = "ItemID_Ref")
entity_network(entity_citations,
source = "Citing_ItemID_Ref",
ref = "ItemID_Ref",
entity = "Author.y",
method = "angle")
#> from to weight Source Target Weighting_method
#> <char> <char> <num> <char> <char> <char>
#> 1: ALBANESI-S BALL-L 0.04859295 ALBANESI-S BALL-L angle
#> 2: ALBANESI-S BARSKY-R 0.06302187 ALBANESI-S BARSKY-R angle
#> 3: ALBANESI-S BEYER-A 0.03458572 ALBANESI-S BEYER-A angle
#> 4: ALBANESI-S BILBIIE-FO 0.06428243 ALBANESI-S BILBIIE-FO angle
#> 5: ALBANESI-S BORDO-M 0.04351941 ALBANESI-S BORDO-M angle
#> ---
#> 1545: VELDE-F WACHTER-M 0.01883109 VELDE-F WACHTER-M angle
#> 1546: VELDE-F WEINTRAUB-S 0.12909944 VELDE-F WEINTRAUB-S angle
#> 1547: VELDE-F WEISE-C 0.06846532 VELDE-F WEISE-C angle
#> 1548: VELDE-F YOUNG-W 0.04803845 VELDE-F YOUNG-W angle
#> 1549: WACHTER-M WEINTRAUB-S 0.14586499 WACHTER-M WEINTRAUB-S angle
# The same entities, linked when the documents of one cite the references of the other
# (nodes: the journals of the cited references, a column of Ref_stagflation)
head(entity_network(Ref_stagflation, source = "Citing_ItemID_Ref", ref = "ItemID_Ref",
entity = "Journal", network = "cocitation", weight_threshold = 2))
#> Warning: Dropping 738 rows with a missing identifier.
#> from to weight Source Target
#> <char> <char> <num> <char> <char>
#> 1: 11147 NBER AM ECON REV 0.1235604 11147 NBER AM ECON REV
#> 2: 11147 NBER CENTRAL BANKING THEO 0.8164966 11147 NBER CENTRAL BANKING THEO
#> 3: 11147 NBER CONQUEST AM INFLATIO 0.3535534 11147 NBER CONQUEST AM INFLATIO
#> 4: 11147 NBER J ECON PERSPECT 0.3086067 11147 NBER J ECON PERSPECT
#> 5: 11147 NBER J MONETARY ECON 0.1280369 11147 NBER J MONETARY ECON
#> 6: 11147 NBER J POLIT ECON 0.2108185 11147 NBER J POLIT ECON
#> Weighting_method
#> <char>
#> 1: angle
#> 2: angle
#> 3: angle
#> 4: angle
#> 5: angle
#> 6: angle