layer_netify combines multiple netify
objects into a single multilayer network structure. Each input network becomes
a layer in the resulting multilayer network, enabling analysis of multiple
relationship types or network views simultaneously.
Arguments
- netlet_list
A list of netify objects to layer together, or the first netify object when passing multiple objects as separate arguments via
.... All objects must have compatible dimensions and attributes (see Details).- ...
Additional netify objects. When provided,
netlet_listshould be a single netify object and all arguments are collected into a list. This allows callinglayer_netify(net1, net2, net3)as a shorthand forlayer_netify(list(net1, net2, net3)).- layer_labels
Character vector specifying names for each layer. If NULL (default), uses names from netlet_list or generates generic labels ("layer1", "layer2", etc.). Length must match the number of netify objects.
Value
A multilayer netify object with structure depending on input type:
Cross-sectional input: 3D array
[actors × actors × layers]Longitudinal array input: 4D array
[actors × actors × layers × time]Longitudinal list input: List of 3D arrays, one per time period
The returned object maintains the netify class and includes:
Combined nodal attributes (if compatible)
Combined dyadic attributes (if compatible)
Layer information accessible via
attr(obj, 'layers')All standard netify attributes
Details
Compatibility requirements:
All netify objects in netlet_list must have identical:
Network type (cross-sectional or longitudinal)
Dimensions (same actors and time periods)
Mode (all unipartite or all bipartite)
Actor composition (same actors in same order)
Mixed directedness:
Layers are allowed to have different symmetry settings (e.g., some symmetric
and others directed). When layers have mixed directedness, the
symmetric attribute is stored as a named logical vector with one
element per layer.
Attribute handling:
Nodal and dyadic attributes are combined when possible:
If attributes are identical across layers, the first layer's attributes are used
If attributes differ but have compatible structure, they are merged
If attributes are incompatible, a warning is issued and attributes must be added manually using
add_node_vars()oradd_dyad_vars()
Note
Memory usage increases with the number of layers. For large networks with many layers, consider whether all layers are necessary for your analysis.
Examples
# Load example data
data(icews)
# Example 1: Cross-sectional multilayer network
icews_10 <- icews[icews$year == 2010, ]
# Create separate networks for different interaction types
verbal_coop <- netify(
icews_10,
actor1 = "i", actor2 = "j",
symmetric = FALSE,
weight = "verbCoop",
nodal_vars = c("i_log_gdp", "i_log_pop"),
dyad_vars = "verbConf"
)
material_coop <- netify(
icews_10,
actor1 = "i", actor2 = "j",
symmetric = FALSE,
weight = "matlCoop",
nodal_vars = "i_polity2",
dyad_vars = "matlConf"
)
# Layer them together
coop_multilayer <- layer_netify(
netlet_list = list(verbal_coop, material_coop),
layer_labels = c("Verbal", "Material")
)
# Check structure
dim(get_raw(coop_multilayer)) # [actors × actors × 2]
#> [1] 152 152 2
attr(coop_multilayer, "layers") # "Verbal" "Material"
#> [1] "Verbal" "Material"
# \donttest{
# Example 2: Longitudinal multilayer (array format)
verbal_longit <- netify(
icews,
actor1 = "i", actor2 = "j", time = "year",
symmetric = FALSE,
weight = "verbCoop",
output_format = "longit_array"
)
material_longit <- netify(
icews,
actor1 = "i", actor2 = "j", time = "year",
symmetric = FALSE,
weight = "matlCoop",
output_format = "longit_array"
)
# Create longitudinal multilayer
longit_multilayer <- layer_netify(
list(verbal_longit, material_longit),
layer_labels = c("Verbal", "Material")
)
dim(get_raw(longit_multilayer)) # [actors × actors × 2 × years]
#> [1] 152 152 2 13
# }