The roundRobinR package provides tools for analyzing
directed dyadic data collected with a round-robin design, in which every
person in a group rates or interacts with every other person. The core
analytical framework is the Social Relations Model
(SRM; Kenny, Kashy, & Cook, 2006), estimated via multilevel modeling
following Snijders and Kenny (1999) and Knight and Humphrey (2019).
The SRM decomposes the total variance in a directed dyadic outcome into four components:
| Component | Interpretation |
|---|---|
| Group | How much groups differ in their mean level |
| Actor | How much people differ in what they give or emit |
| Partner | How much people differ in what they receive or elicit |
| Dyad | Variance in the unique relationship between each specific pair |
In addition, two reciprocity parameters are estimated:
The package includes sampleDyadData, a simulated dataset
with 1,548 rows from a round-robin design collected at two time
points.
head(sampleDyadData)
#> groupId actId partId timeId contact liking actEx actAg actMale actAge
#> 4 1 1 2 1 1 7 4.4 4.4 1 19
#> 1300 1 1 2 2 NA 7 2.7 3.2 1 19
#> 7 1 1 3 1 1 7 4.4 4.4 1 19
#> 1303 1 1 3 2 NA 7 2.7 3.2 1 19
#> 11 1 1 4 1 NA 7 4.4 4.4 1 19
#> 1307 1 1 4 2 NA 7 2.7 3.2 1 19
#> partEx partAg partMale partAge groupCohesion groupEfficacy
#> 4 4.7 1.5 0 20 NA NA
#> 1300 3.8 1.5 0 20 NA NA
#> 7 5.0 1.5 1 21 NA NA
#> 1303 5.6 1.3 1 21 NA NA
#> 11 3.5 2.0 1 20 NA NA
#> 1307 4.7 1.2 1 20 NA NA
nrow(sampleDyadData)
#> [1] 1584
length(unique(sampleDyadData$groupId))
#> [1] 66Key variables:
groupId, actId, partId —
group, actor, and partner identifierstimeId — time point (1 or 2)liking — directed dyadic rating of liking (the main
outcome)actEx, partEx — actor and partner
extraversion scorescontact — dyad-level contact frequencygroupCohesion — group-level cohesionThe SRM requires a set of dummy variables for each actor and partner
position within a group. createDummies() generates these
automatically.
d <- createDummies(
group.id = "groupId",
act.id = "actId",
part.id = "partId",
d = sampleDyadData[sampleDyadData$timeId == 1, ],
merge.original = TRUE
)
head(d[, c("groupId", "actId", "partId", "pdSRM_dyad_id",
"a1", "a2", "a3", "a4", "p1", "p2", "p3", "p4")])
#> groupId actId partId pdSRM_dyad_id a1 a2 a3 a4 p1 p2 p3 p4
#> 1 1 1 2 1 1 0 0 0 0 1 0 0
#> 2 1 1 3 2 1 0 0 0 0 0 1 0
#> 3 1 1 4 4 1 0 0 0 0 0 0 1
#> 4 1 2 1 1 0 1 0 0 1 0 0 0
#> 5 1 2 3 3 0 1 0 0 0 0 1 0
#> 6 1 2 4 5 0 1 0 0 0 0 0 1The key output columns are:
a1–a4: actor dummy variables (one equals 1
per row, indicating which group position is acting)p1–p4: partner dummy variables (same, for
the partner)pdSRM_dyad_id: undirected dyad identifier (shared by
i→j and j→i)The simplest model decomposes total variance into the four SRM
components with no predictors. srmRun() handles dummy
creation and model fitting in one step.
null_mod <- srmRun(
dv = "liking",
groupId = "groupId",
actId = "actId",
partId = "partId",
data = sampleDyadData[sampleDyadData$timeId == 1, ]
)
null_mod$srm.output
#> variances.and.covariances percents.and.correlations
#> Group 0.122 9.926
#> Actor 0.808 65.596
#> Partner 0.027 2.154
#> Dyad 0.275 22.324
#> Generalized Reciprocity 0.002 0.011
#> Dyadic Reciprocity 0.009 0.033Reading the output:
variances.and.covariances: raw variance estimates for
each componentpercents.and.correlations: for the four variance
components, the percentage of total variance; for the two reciprocity
rows, the correlation coefficientsAdding fixed effects tests whether actor-level, partner-level, or dyad-level predictors explain variance in the outcome.
full_mod <- srmRun(
dv = "liking",
groupId = "groupId",
actId = "actId",
partId = "partId",
feVars = c("actEx", "partEx", "contact"),
data = sampleDyadData[sampleDyadData$timeId == 1, ]
)
full_mod$srm.output
#> variances.and.covariances percents.and.correlations
#> Group 0.119 9.790
#> Actor 0.800 66.073
#> Partner 0.020 1.667
#> Dyad 0.272 22.470
#> Generalized Reciprocity 0.000 -0.002
#> Dyadic Reciprocity 0.005 0.018The fixed-effect estimates can be examined with:
summary(full_mod$lme.output)$tTable
#> Value Std.Error DF t-value p-value
#> (Intercept) 5.20484636 0.26625736 683 19.5481783 6.346570e-68
#> actEx 0.07387859 0.06060827 683 1.2189522 2.232832e-01
#> partEx -0.01342750 0.02468930 683 -0.5438589 5.867161e-01
#> contact 0.07888947 0.01591042 683 4.9583522 8.979027e-07srmPseudoRSq() compares the null and full models to
estimate the proportion of variance in each component explained by the
predictors.
srmPseudoRSq(
null.model = null_mod$lme.output,
predict.model = full_mod$lme.output
)
#> null predict pseudoR2
#> Group 0.12228080 0.11860539 0.030057131
#> Actor 0.80811232 0.80048626 0.009436881
#> Partner 0.02654036 0.02019843 0.238954181
#> Dyad 0.27502661 0.27222552 0.010184796A positive pseudoR2 for a given component means the
fixed effects reduced that component’s variance, suggesting the
predictors partly explain the group-, actor-, partner-, or
relationship-level variation.
Kenny, D. A., Kashy, D. A., & Cook, W. L. (2006). Dyadic Data Analysis. Guilford Press.
Knight, A. P., & Humphrey, S. E. (2019). Dyadic data analysis. In S. E. Humphrey & J. M. LeBreton (Eds.), The Handbook for Multilevel Theory, Measurement, and Analysis (pp. 423–447). American Psychological Association. https://doi.org/10.1037/0000115-019
Snijders, T. A. B., & Kenny, D. A. (1999). The social relations model for family data: A multilevel approach. Personal Relationships, 6, 471–486. https://doi.org/10.1111/j.1475-6811.1999.tb00204.x