Skip to content

Commit f28a2be

Browse files
committed
implemented filtering
1 parent 7c500dc commit f28a2be

3 files changed

Lines changed: 61 additions & 8 deletions

File tree

R/infer_dyad_compositions.R

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,13 @@ infer_dyad_compositions <- function(data, seed = NULL, include_compositions = NU
117117
.i_pool_member = NA_character_
118118
)
119119

120-
# Filter and only include requested compositions, if filtering was requested!
120+
# Apply composition filtering before exchangeability overrides and pooling.
121121
include_result <- apply_include_compositions(
122122
data = data,
123123
dyad_roles = dyad_roles,
124124
include_compositions = include_compositions,
125+
set_exchangeable_compositions = set_exchangeable_compositions,
126+
pool_compositions = pool_compositions,
125127
group_name = group_name
126128
)
127129
data <- include_result$data
@@ -217,7 +219,9 @@ infer_dyad_compositions <- function(data, seed = NULL, include_compositions = NU
217219
}
218220

219221

220-
apply_include_compositions <- function(data, dyad_roles, include_compositions, group_name) {
222+
apply_include_compositions <- function(data, dyad_roles, include_compositions,
223+
set_exchangeable_compositions,
224+
pool_compositions, group_name) {
221225
if (is.null(include_compositions)) {
222226
return(list(data = data, dyad_roles = dyad_roles))
223227
}
@@ -230,13 +234,44 @@ apply_include_compositions <- function(data, dyad_roles, include_compositions, g
230234
)
231235
}
232236

233-
# get cannonical composition-labels
237+
# Get canonical composition labels for the filter.
234238
include_compositions_resolved <- resolve_composition_references(
235239
references = include_compositions,
236240
observed_compositions = dyad_roles[[interdep_composition_col]],
237241
arg_name = "include_compositions"
238242
)
239243

244+
# Resolve later composition references so we can catch references removed by
245+
# the filter and provide a clearer error.
246+
set_exchangeable_compositions_resolved <- resolve_composition_references(
247+
references = set_exchangeable_compositions,
248+
observed_compositions = dyad_roles[[interdep_composition_col]],
249+
arg_name = "set_exchangeable_compositions"
250+
)
251+
252+
pool_composition_references <- NULL
253+
if (is.list(pool_compositions)) {
254+
pool_composition_references <- unlist(pool_compositions, use.names = FALSE)
255+
}
256+
pool_compositions_resolved <- resolve_composition_references(
257+
references = pool_composition_references,
258+
observed_compositions = dyad_roles[[interdep_composition_col]],
259+
arg_name = "pool_compositions"
260+
)
261+
262+
# Check if later arguments refer to compositions removed by the filter.
263+
referenced_later <- c(set_exchangeable_compositions_resolved, pool_compositions_resolved)
264+
if (!all(referenced_later %in% include_compositions_resolved)) {
265+
references_removed_by_include <- setdiff(referenced_later, include_compositions_resolved)
266+
stop(
267+
"`include_compositions` filters out composition(s) that are later referenced by ",
268+
"`set_exchangeable_compositions` or `pool_compositions`: ",
269+
paste(sort(references_removed_by_include), collapse = ", "),
270+
". Add them to `include_compositions` or remove them from the later argument.",
271+
call. = FALSE
272+
)
273+
}
274+
240275
# Get dyad-ids that we keep
241276
keep_dyads <- dyad_roles |>
242277
dplyr::filter(.data[[interdep_composition_col]] %in% include_compositions_resolved) |>

tests/testthat/test-prepare_interdep_data.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ test_that("prepare_interdep_data applies include_compositions before constrainin
434434
set_exchangeable_compositions = "female-male",
435435
seed = 123
436436
),
437-
"`set_exchangeable_compositions` contains unknown dyad composition",
437+
"`include_compositions` filters out composition(s) that are later referenced by `set_exchangeable_compositions` or `pool_compositions`: female_x_male. Add them to `include_compositions` or remove them from the later argument.",
438438
fixed = TRUE
439439
)
440440

@@ -448,7 +448,7 @@ test_that("prepare_interdep_data applies include_compositions before constrainin
448448
pool_compositions = list(couples = c("female-female", "female-male")),
449449
seed = 123
450450
),
451-
"`pool_compositions` contains unknown dyad composition",
451+
"`include_compositions` filters out composition(s) that are later referenced by `set_exchangeable_compositions` or `pool_compositions`: female_x_male. Add them to `include_compositions` or remove them from the later argument.",
452452
fixed = TRUE
453453
)
454454
})

vignettes/getting-started.Rmd

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,27 @@ We can use this data to model these dyad types as separate or in the same model;
318318
the [Actor-Partner Interdependence Model vignette](apim.html) shows both
319319
mixed-composition formulas and practical convergence notes.
320320

321+
### Keeping only selected dyad compositions (filtering)
322+
323+
Sometimes a mixed dataset contains dyad compositions that should not be part of
324+
a given analysis. Use `include_compositions` to keep only dyads whose *observed*
325+
composition matches the requested labels. The filtering happens before exchangeability
326+
constraints and pooling, so `set_exchangeable_compositions` and
327+
`pool_compositions` arguments can only refer to retained types of dyads.
328+
329+
```{r prepare-mixed-cross-sectional-included}
330+
mixed_cross_data_included <- prepare_interdep_data(
331+
example_dyadic_crosssectional_mixed,
332+
group = coupleID,
333+
member = personID,
334+
role = gender,
335+
include_compositions = c("female-female", "male-male"),
336+
seed = 123
337+
)
338+
339+
print(mixed_cross_data_included, n = 4)
340+
```
341+
321342
### Setting distinguishable dyads to be treated as exchangeable
322343

323344
As mentioned earlier, omitting the `role` argument treated all
@@ -389,9 +410,6 @@ print(mixed_cross_data_pooled_constrained)
389410
```
390411

391412

392-
If you want to exclude some dyad compositions completely, filter them before
393-
preparation. A dedicated composition-inclusion argument is planned.
394-
395413
For model formulas and interpretation, continue with the
396414
[Actor-Partner Interdependence Model vignette](apim.html),
397415
[Dyad-Individual Model vignette](dim.html), or

0 commit comments

Comments
 (0)