What it is
Social network elicitation gathers data on relationships between individuals within a defined population. Rather than asking about individual attributes, it asks about ties: who does the respondent talk to about farming, who would they turn to in a financial emergency, whose advice do they follow on health decisions. The resulting data describe a network — a set of nodes (individuals) connected by edges (relationships) — that can be analysed as a structure in its own right or used to measure each individual’s network position.
Throughout this guide, ego refers to the respondent and alter refers to a person named by the respondent.
Network data are used in field research for two related purposes: (a) understanding how information, behaviours, or resources spread through a community — diffusion analysis, modelled with a tie-by-tie generative model; and (b) constructing individual-level measures of network position — degree, eigenvector or diffusion centrality, betweenness — used as predictors, moderators, or primary outcomes in regression.
When to use it
Network elicitation is appropriate when social structure is theorised to affect the outcome of interest — when adoption decisions are influenced by neighbours, when information about a programme travels through social ties, or when a treatment works partly by changing social norms or peer behaviour.
Banerjee, Chandrasekhar, Duflo & Jackson (2013) censused 43 Indian villages and elicited several relationship types (visiting, lending, advice). They use eigenvector centrality of the first households informed by the microfinance institution to predict village-level take-up — but they motivate this on the grounds that eigenvector centrality is the long-run limit of diffusion centrality, the conceptually correct measure for short-horizon information spread. The follow-up Banerjee, Chandrasekhar, Duflo & Jackson (2019) formalises diffusion centrality, validates it experimentally, and shows it dominates eigenvector centrality at the time scales relevant to most field programmes. Cai, de Janvry & Sadoulet (2015) randomised the timing and intensity of weather-insurance information sessions across farmers in Chinese villages and show that adoption rises among farmers whose network contacts attended an intensive first-round session — identifying information diffusion as the mechanism, not payout learning (payouts had not occurred at the time of second-round measurement).
Both studies elicited sociocentric data (the full village network), and Banerjee et al. did so via free-recall name generators over a censused population — illustrating that “free-recall vs roster” and “egocentric vs sociocentric” are orthogonal choices (see Key decisions below).
Network elicitation is less productive when the relevant relationships are so context-specific that respondents cannot reliably identify them, or when the population cannot be enumerated and the analyst needs sociocentric measures. For unenumerable or hidden populations, the relevant tools are egocentric elicitation with name generators, Aggregated Relational Data (Breza, Chandrasekhar, McCormick & Pan, 2020), or scale-up estimation (McCarty, Killworth & Bernard, 2001) — see Key decisions.
How it works
Network data are collected using name generators and, optionally, name interpreters.
Name generators ask the respondent to list individuals who satisfy a relationship criterion: “Who in this village have you talked to about agricultural practices in the past month?” or “If you needed to borrow 500 rupees urgently, who would you ask?” Different generators elicit different network types — information networks, financial support networks, kinship networks — which are not interchangeable. The choice of generator should match the relationship theorised to matter for the research question.
Name interpreters follow up on each named alter with questions about the relationship: how long they have known each other, how often they meet, whether the relationship is reciprocated, perceived characteristics of the alter. They increase data richness at the cost of survey length.
Two orthogonal design decisions define the elicitation:
-
Data structure: egocentric or sociocentric. An egocentric design collects each respondent’s direct ties (and optionally tie-to-tie connections via name interpreters); the unit of analysis is the ego-network. A sociocentric design censuses a defined population (village, school class, group) and matches each named alter back to the population so that a full adjacency matrix can be assembled. Global measures like betweenness, clustering coefficients, and diffusion centrality require sociocentric data.
-
Elicitation mode: free recall or roster. Free recall asks the respondent to volunteer names from memory. Roster prompts the respondent with a pre-loaded list and asks them to select alters. The two modes are independent of the structural choice: Banerjee et al. (2013) used free recall to build sociocentric networks of censused villages; classroom studies routinely show a class roster (roster mode) to build ego-networks (egocentric structure). Free recall is faster, lighter on instrumentation, and exposes recall bias — it systematically undercounts weak and infrequent ties (Marsden, 1990, 2011; Marin, 2004). Roster mode reduces recall failure at the cost of order and priming effects.
Identification assumptions. Centrality-based regressions of the form outcome ~ centrality + treatment + controls carry implicit assumptions that often go unstated:
- The network is measured without systematic error. False-negative rates that correlate with respondent characteristics (literacy, age, attentiveness) mechanically correlate centrality with those characteristics; random measurement error attenuates centrality coefficients in ways that depend non-trivially on the error rate (Wang, Shi, McFarland & Leskovec, 2012; Newman, 2018).
- The elicited tie type matches the channel through which the outcome propagates. A financial-support generator does not give a valid information-diffusion network and vice versa.
- The sample of nodes is the full network. Partial node samples (anything below 100% census) produce centrality and clustering measures that are biased in ways that depend non-monotonically on the sampling rate; corrections require the two-step procedure in Chandrasekhar & Lewis (2016).
- Selection into network position is not a confound. Centrality is not randomly assigned. A regression of
outcome ~ centralityis descriptive; the same individual characteristics that drive centrality often drive the outcome. - SUTVA holds across the unit of analysis. When treatments propagate through ties, individual ITT estimates are contaminated by spillover. Aronow & Samii (2017) exposure mappings and Athey, Eckles & Imbens (2018) randomisation inference are the standard tools for inference under network interference.
Key decisions
Egocentric vs sociocentric structure. Choose by what global properties the analysis requires. Sociocentric data supports betweenness, clustering, component structure, and diffusion centrality. Egocentric data supports degree, ego-network density, and composition of direct ties. Sociocentric studies need a complete prior census of the population; egocentric studies do not.
Free recall vs roster elicitation. Independent of the above. Free recall is cheaper but undercounts weak and infrequent ties; roster mode is more complete but introduces order effects (Marin, 2004; Pustejovsky & Spillane, 2009) — alters near the top of an alphabetised roster are over-nominated. Hamlet- or affinity-ordered rosters can prime same-cluster nominations.
Aggregated Relational Data (ARD). Where full roster elicitation is infeasible — large populations, hidden populations, limited time per respondent — Breza, Chandrasekhar, McCormick & Pan (2020) show that “how many people do you know who…” questions over a small set of traits, combined with a latent-space model, recover network statistics close to those from full elicitation at a small fraction of the cost. ARD is the right default when the network is large enough that roster elicitation would exceed 20–30 minutes per respondent. For populations that cannot be defined by a roster at all (drug users, undocumented migrants), the scale-up / network-size estimation literature (McCarty, Killworth & Bernard, 2001) is the alternative.
Directed vs undirected ties. Most social relationships are directional — advice-seeking is not advice-giving — and treating ties as undirected destroys information. Directed analysis requires asking each ego independently about their ties and recording both directions. Note a software-side trap: eigenvector centrality on a directed sparse village graph commonly fails to converge or returns a near-flat vector unless computed on the largest strongly connected component (or with directed = FALSE as an explicit modelling choice). Both networkx and igraph will fail silently in this case.
Choice of centrality measure for diffusion outcomes. Diffusion centrality (Banerjee et al., 2019) is the structurally correct measure for short-horizon information spread; eigenvector centrality is its limit only as the communication horizon T → ∞. For a programme that runs for weeks or months, diffusion centrality usually dominates eigenvector centrality empirically. Where the analyst keeps eigenvector centrality, they should justify the long-horizon assumption.
Number and type of name generators. A single, carefully chosen generator that matches the relationship type theorised to matter beats multiple generators that dilute attention. Generators should describe a specific, recent, observable behaviour (“who did you talk to about seeds this past season?”) rather than an abstract relationship (“who are your farming friends?”).
Free-recall cap. Caps below ~8 truncate the right tail of the degree distribution and compress the centrality differentials that the analysis needs. The 30–40% truncation rate sometimes cited for a cap of 5 (Marsden, 2003) is dense-network-specific; pilot the cap against the village density seen in the field, and prefer “as many as you can think of” with a soft prompt over a hard cap where survey time permits.
Boundary specification. Define the network boundary explicitly — which individuals are included. “Village members” is ambiguous when households are seasonal migrants or straddle administrative lines. A census-based enumeration before network data collection reduces boundary uncertainty and is required for any sociocentric study.
Sample size and power. Most network experiments randomise at the village (network) level; the effective N for inference about a treatment is the number of villages, typically 40–80 in this literature, not the number of households. For diffusion designs, simulation-based power calculations against a generative network model — fit ARD or pilot-network parameters, simulate treatment assignment and outcomes under a candidate effect size, and compute empirical power — are standard.
Caveats & common mistakes
Recall bias and false negatives. Free-recall data systematically undercount weak and infrequent ties. The dominant error is the false negative, not the false positive — degree, eigenvector, and diffusion centrality are all attenuated downward. Roster designs cue recall but introduce order effects. Neither is bias-free.
Sampled-network bias is severe and hard to correct. A 50% sample of nodes typically yields ~25% of edges, and the resulting centrality and clustering measures are biased in ways that depend non-monotonically on the sampling rate and network density (Chandrasekhar & Lewis, 2016). Centrality measures computed from anything below ~95% census coverage should be reported with this caveat, and corrected via the Chandrasekhar–Lewis two-step procedure where feasible. Treating partial-sample centrality as a true measure is a common and consequential error.
Reciprocity rates are tie-type-specific. Kinship and close-friend nominations show reciprocity above 60% in rural-village networks; advice-seeking 20–40%; financial-help 10–20%. A single across-the-board threshold (e.g., “below 30% is problematic”) will mislead. Compare against published rates for the same tie type or against a pilot sample before flagging.
Network effects and SUTVA. When treatments propagate through ties, individual ITT estimates absorb spillover, biasing them in either direction depending on whether spillover reinforces or displaces the direct effect. The fix is to model exposure: estimate the share of each unit’s ties that are treated and include it as a regressor, or use Aronow & Samii (2017) exposure mappings with Athey, Eckles & Imbens (2018) randomisation inference for valid p-values.
Mechanical correlation among centrality measures. Degree, eigenvector, and betweenness are typically correlated at r > 0.7 in real village networks. Including them jointly in one OLS induces severe multicollinearity, flips signs, and inflates standard errors. Run separate models per measure or motivate one ex ante.
Privacy in small communities. Naming specific individuals in the context of financial transfers, conflict, or health behaviour raises real privacy concerns. Consent should cover both ego and named alters. A tablet roster on a screen visible to bystanders breaks privacy in the field. Use a private viewing angle, side-shield, or audio-only delivery for sensitive generators.
Network dynamics. A single cross-section is a snapshot; ties form, dissolve, and shift in salience. Diffusion questions that play out over months or years need panel network data — rare but more informative.
Analysis Guide
# 1. Build the directed network from an edge list. Pre-condition: edge_list and
# node_attributes share a stable, census-time alter identifier (NOT names),
# and node_attributes is a superset of nodes in edge_list — isolates must be
# rows with no edges, else they are silently dropped from centrality.
import numpy as np, pandas as pd
import networkx as nx
import statsmodels.formula.api as smf
np.random.seed(20260606) # for stochastic ops below (k-betweenness, permutation)
G = nx.from_pandas_edgelist(edge_list, source="from_id", target="to_id",
create_using=nx.DiGraph())
G.add_nodes_from(node_attributes['id']) # ensure isolates are kept
# 2. Compute centrality. Eigenvector centrality on a directed sparse village graph
# often fails to converge — compute on the largest strongly connected component,
# or use diffusion centrality (Banerjee et al. 2019) which is the conceptually
# correct measure for short-horizon information spread; eigenvector centrality
# is its T->infinity limit.
deg_in = pd.Series(dict(G.in_degree()), name='degree_in')
deg_out = pd.Series(dict(G.out_degree()), name='degree_out')
between = pd.Series(nx.betweenness_centrality(G, normalized=True), name='between')
# For >5000 nodes use nx.betweenness_centrality(G, k=500) (approximate).
scc = max(nx.strongly_connected_components(G), key=len)
G_scc = G.subgraph(scc).copy()
eig_scc = nx.eigenvector_centrality_numpy(G_scc)
eigen = pd.Series({n: eig_scc.get(n, np.nan) for n in G.nodes()}, name='eigen')
# 3. Diffusion centrality (Banerjee et al. 2019) — implemented from primitives:
# DC_i = sum over s,t of (p * A)^t at receiver i, summed across s. Choose T to
# match the programme horizon and p ~ 1/lambda_max of A so the series stays bounded.
A = nx.to_numpy_array(G, nodelist=list(G.nodes()))
p = 1.0 / max(np.linalg.eigvals(A).real.max(), 1e-6)
T = 3
M = np.zeros_like(A); P = np.eye(A.shape[0])
for t in range(1, T+1):
P = P @ (p * A); M = M + P
diffusion = pd.Series(M.sum(axis=0), index=list(G.nodes()), name='diffusion')
# 4. Merge with outcomes via a left join from outcomes, and report counts of
# unmatched on both sides. Silently dropping isolates or unmatched units
# distorts the analysis sample.
net_df = pd.concat([deg_in, deg_out, eigen, between, diffusion], axis=1).reset_index()
net_df = net_df.rename(columns={'index': 'id'})
merged = outcomes.merge(net_df, on='id', how='left', indicator=True)
print(merged['_merge'].value_counts()) # left_only flags outcomes without network
# 5. Standardise centrality WITHIN VILLAGE before pooling — eigenvector and
# betweenness are normalised to depend on network size, so absolute values
# are not comparable across villages of different size.
for v in ['degree_in', 'eigen', 'between', 'diffusion']:
merged[v + '_z'] = merged.groupby('village_id')[v].transform(
lambda x: (x - x.mean()) / x.std(ddof=0))
# 6. Run SEPARATE regressions per centrality measure — degree, eigen, and
# betweenness are mechanically correlated at r > 0.7 in real village networks;
# including them jointly flips signs and inflates SEs. Cluster SEs at village.
for v in ['degree_in_z', 'eigen_z', 'between_z', 'diffusion_z']:
f = smf.ols(f'outcome ~ {v} + treatment + age + female',
data=merged).fit(
cov_type='cluster', cov_kwds={'groups': merged['village_id']})
print(v, f.params[v], f.bse[v], f.pvalues[v])
# 7. For inference ABOUT the centrality measure itself (not about a treatment
# independent of the network), the OLS p-value is invalid — centrality
# regressors are induced by the same graph. Use node-label permutation
# within village (QAP-style): permute the centrality vector within each
# village, re-run the regression, and read off the share of permutations
# yielding |coef| >= the observed |coef|.
def perm_p(merged, var, n_perm=999):
obs = smf.ols(f'outcome ~ {var}', data=merged).fit().params[var]
null = []
for _ in range(n_perm):
m2 = merged.copy()
m2[var] = m2.groupby('village_id')[var].transform(np.random.permutation)
null.append(smf.ols(f'outcome ~ {var}', data=m2).fit().params[var])
return float(np.mean(np.abs(null) >= np.abs(obs)))
print('perm p (eigen_z):', perm_p(merged, 'eigen_z', n_perm=999))
# 8. Exposure mapping for spillover designs (Aronow & Samii 2017): the share of
# each ego's alters who are treated. Include as a regressor alongside own
# treatment; for valid inference use Athey, Eckles & Imbens (2018) network
# randomisation inference (sketch only — full implementation is non-trivial).
T_vec = merged.set_index('id')['treatment']
merged['exposure'] = merged['id'].map(
{n: T_vec.reindex(list(G.successors(n))).mean() for n in G.nodes()})
fit_sp = smf.ols('outcome ~ treatment + exposure + age + female',
data=merged).fit(
cov_type='cluster', cov_kwds={'groups': merged['village_id']})
print(fit_sp.summary()) SurveyCTO / XLSForm
For roster-mode elicitation in a censused village, pre-load roster.csv with stable census-time alter IDs (e.g., hh_id), names, and hamlet/cluster identifiers. Reference it from the form with pulldata():
| Item | Type / Appearance | Notes |
|---|---|---|
ego_hh_id | calculate | The respondent’s own household ID — used to filter self-nominations |
alters | select_multiple roster with appearance = search('roster', 'matches', 'hamlet', ${ego_hamlet}) or minimal autocomplete | Use choice_filter = hh_id != ${ego_hh_id} to prevent self-nomination; count-selected(.) <= 10 if a cap is enforced |
| repeat group | begin_repeat over selected alters using indexed-repeat(${alters}, position(..)) | One iteration per nominated alter for name-interpreter questions |
| name-interpreter items | select_one / integer inside the repeat | Frequency of contact, reciprocity perception, relationship duration |
Store both ${ego_hh_id} and the concatenated ${alters} (the list of nominated alter IDs) so the analyst can reconstruct edges without ambiguity. For free-recall elicitation, replace the roster-backed select_multiple with a text field per nomination — but then provide a post-survey matching step where alter names are reconciled to census IDs (free-recall name strings are not directly usable; misspellings, partial names, and aliases must be resolved). Add a constraint against duplicate nominations within a respondent.
In face-to-face elicitation, the tablet screen showing the roster is visible to anyone nearby — a privacy breach for sensitive generators (financial transfers, health, conflict). Use a side-shield, a private viewing angle, or audio-only delivery for sensitive tie types.
For very large populations (>500 nodes) where roster elicitation exceeds 20–30 minutes per respondent, use Aggregated Relational Data instead — short “how many people do you know who…” items across a trait basket. See Breza et al. (2020) and the open-source networkscaleup R package.
Reading the output
- Degree (
degree_infor sociocentric, total degree for egocentric) is the most interpretable measure: number of nominations received (or sent). Report degree distributions per village before pooling — village-mean degree varies with both population and reporting habits. - Eigenvector centrality is normalised to unit L2 norm within each network and therefore scales as 1/√n with network size — absolute values are not comparable across villages of different size, and absolute thresholds like “above 0.5” are meaningless across networks. Interpret as within-village rank or z-score; standardise within village before pooling.
- Betweenness centrality (normalised) rarely exceeds 0.1–0.2 even for top brokers in real village networks; “near 1” is essentially never observed. Interpret by rank within village.
- Diffusion centrality at horizon T = number of communication rounds the programme can plausibly support (typically 2–5 for a short campaign; larger T converges to eigenvector centrality). Report the chosen T explicitly.
- Reciprocity is tie-type specific. Benchmark against the relevant literature: kinship 60%+, advice 20–40%, financial-help 10–20% in rural-village networks. A low rate for an inherently asymmetric tie type is a feature, not a defect.
- Regression output: report SEs clustered at the network/village level — HC1/HC2 are wrong for multi-village data. If the regressor of interest is the centrality measure itself (rather than an independently assigned treatment), report a QAP / node-label permutation p-value alongside the cluster-SE p-value; the OLS p-value alone is anti-conservative because centrality regressors are induced by the same graph.
- Exposure / spillover: in a spillover design, report both the direct treatment coefficient and the exposure (share of alters treated) coefficient, with randomisation-inference p-values where feasible (Athey, Eckles & Imbens, 2018).
References
Aronow, P. M., & Samii, C. (2017). Estimating average causal effects under general interference, with application to a social network experiment. Annals of Applied Statistics, 11(4), 1912–1947. https://doi.org/10.1214/16-AOAS1005
Athey, S., Eckles, D., & Imbens, G. W. (2018). Exact p-values for network interference. Journal of the American Statistical Association, 113(521), 230–240. https://doi.org/10.1080/01621459.2016.1241178
Banerjee, A., Chandrasekhar, A. G., Duflo, E., & Jackson, M. O. (2013). The diffusion of microfinance. Science, 341(6144), 1236498. https://doi.org/10.1126/science.1236498
Banerjee, A., Chandrasekhar, A. G., Duflo, E., & Jackson, M. O. (2019). Using gossips to spread information: Theory and evidence from two randomized controlled trials. Review of Economic Studies, 86(6), 2453–2490. https://doi.org/10.1093/restud/rdz008
Breza, E., Chandrasekhar, A. G., McCormick, T. H., & Pan, M. (2020). Using aggregated relational data to feasibly identify network structure without network data. American Economic Review, 110(8), 2454–2484. https://doi.org/10.1257/aer.20170861
Cai, J., de Janvry, A., & Sadoulet, E. (2015). Social networks and the decision to insure. American Economic Journal: Applied Economics, 7(2), 81–108. https://doi.org/10.1257/app.20130442
Chandrasekhar, A. G., & Lewis, R. (2016). Econometrics of sampled networks (Working paper, Stanford University). https://web.stanford.edu/~arungc/CL.pdf
Jackson, M. O. (2008). Social and economic networks. Princeton University Press.
Marin, A. (2004). Are respondents more likely to list alters with certain characteristics? Implications for name generator data. Social Networks, 26(4), 289–307. https://doi.org/10.1016/j.socnet.2004.06.001
Marsden, P. V. (1990). Network data and measurement. Annual Review of Sociology, 16, 435–463. https://doi.org/10.1146/annurev.so.16.080190.002251
Marsden, P. V. (2003). Interviewer effects in measuring network size using a single name generator. Social Networks, 25(1), 1–16. https://doi.org/10.1016/S0378-8733(02)00009-6
Marsden, P. V. (2011). Survey methods for network data. In J. Scott & P. J. Carrington (Eds.), The SAGE handbook of social network analysis (pp. 370–388). SAGE.
McCarty, C., Killworth, P. D., Bernard, H. R., Johnsen, E. C., & Shelley, G. A. (2001). Comparing two methods for estimating network size. Human Organization, 60(1), 28–39. https://doi.org/10.17730/humo.60.1.efx5t9gjtgmga73y
Newman, M. E. J. (2018). Network structure from rich but noisy data. Nature Physics, 14(6), 542–545. https://doi.org/10.1038/s41567-018-0076-1
Pustejovsky, J. E., & Spillane, J. P. (2009). Question-order effects in social network name generators. Social Networks, 31(4), 221–229. https://doi.org/10.1016/j.socnet.2009.06.001
Wang, D. J., Shi, X., McFarland, D. A., & Leskovec, J. (2012). Measurement error in network data: A re-classification. Social Networks, 34(4), 396–409. https://doi.org/10.1016/j.socnet.2012.01.003
Wasserman, S., & Faust, K. (1994). Social network analysis: Methods and applications. Cambridge University Press.