An sframe instrument records the research design, not
only the questions. This vignette builds a slice of the published
Thailand digital marketing study (Sharafuddin, Madhavan, and Wangtueai
2024) with the constructors shown one at a time, then adds the analysis
plan and a measurement model. The full study is assembled in the
worked-study vignette.
Choice sets define reusable response options. Items reference them
through choice_set.
Items are response variables unless their type is
section_break or text_block. Required items
carry required = TRUE. Item IDs should stay stable, because
response columns reuse them and the analysis plan refers to them. These
items measure perceived value (DMPV) and tourist satisfaction (TS).
intro <- sf_item(
"intro", "About your trip",
type = "section_break",
section_intro = "Please rate your experience of digital booking and your visit."
)
dmpv_1 <- sf_item("dmpv_1", "The destination's online content was trustworthy.",
type = "likert", required = TRUE, choice_set = "likert5", scale_id = "DMPV")
dmpv_2 <- sf_item("dmpv_2", "The online information was consistent across platforms.",
type = "likert", required = TRUE, choice_set = "likert5", scale_id = "DMPV")
dmpv_3 <- sf_item("dmpv_3", "The digital channels offered good value for money.",
type = "likert", required = TRUE, choice_set = "likert5", scale_id = "DMPV")
dmpv_4 <- sf_item("dmpv_4", "I was aware of the destination through digital channels.",
type = "likert", required = TRUE, choice_set = "likert5", scale_id = "DMPV")
ts_1 <- sf_item("ts_1", "The trip met my expectations.",
type = "likert", required = TRUE, choice_set = "likert5", scale_id = "TS")
ts_2 <- sf_item("ts_2", "My overall travel experience was satisfying.",
type = "likert", required = TRUE, choice_set = "likert5", scale_id = "TS")
ts_3 <- sf_item("ts_3", "I felt comfortable at the destination.",
type = "likert", required = TRUE, choice_set = "likert5", scale_id = "TS")
visitor_type <- sf_item("visitor_type", "I am a",
type = "single_choice", required = TRUE, choice_set = "visitor")
attention <- sf_item("attention", "For quality control, please select Agree.",
type = "single_choice", required = TRUE, choice_set = "likert5")A scale records item membership, the scoring method, any reverse-coded items, and the minimum number of valid items needed to compute a score.
Checks keep the quality-control logic with the instrument.
A branch shows or hides an item based on an earlier answer. This one is a placeholder for a repeat-visitor follow-up.
Each block binds a research question to a technique and to the
variables that fill each role. A reliability check expects
items. A group comparison expects a group and
an outcome.
analysis_plan <- list(
list(id = "M1", research_question = "Is perceived value internally consistent?",
family = "measurement", method = "reliability_alpha",
roles = list(items = c("dmpv_1", "dmpv_2", "dmpv_3", "dmpv_4"))),
list(id = "RQ1", research_question = "Do repeat visitors report higher satisfaction?",
family = "group_comparison", method = "mann_whitney",
roles = list(group = "visitor_type", outcome = "TS"),
options = list(alpha = 0.05))
)sf_instrument() takes the questions through
components and the research design through
analysis_plan and models. The model is added
with add_model(), which checks each indicator against the
instrument items.
instr <- sf_instrument(
title = "Digital marketing study (teaching slice)",
version = "1.0.0",
description = "A slice of the published Thailand study for teaching the constructors.",
authors = "Research team",
languages = "en",
components = list(
likert5, visitor,
intro, dmpv_1, dmpv_2, dmpv_3, dmpv_4, ts_1, ts_2, ts_3,
visitor_type, attention, dmpv, ts, attention_check, repeat_branch
),
analysis_plan = analysis_plan
)
ts_model <- sf_model(
id = "ts_cfa",
label = "Satisfaction measurement model",
type = "cfa",
constructs = list(
sf_construct("DMPV", "Perceived value", c("dmpv_1", "dmpv_2", "dmpv_3", "dmpv_4")),
sf_construct("TS", "Tourist satisfaction", c("ts_1", "ts_2", "ts_3"))
)
)
instr <- add_model(instr, ts_model)validate_sframe() returns a diagnostic. Print it to read
the result, and use the accessors to get at the parts.
validate_sframe(instr, strict = FALSE)
#> <sframe validation>
#> Instrument: Digital marketing study (teaching slice) (1.0.0)
#> Status: valid
#> Checks: 18 run, 0 with problemsvalidation <- validate_sframe(instr, strict = FALSE)
sf_is_valid(validation)
#> [1] TRUE
sf_problems(validation)
#> character(0)In production, strict validation stops with a structured error when
anything is wrong. When it passes, as_sframe() recovers the
instrument with its validated stamp set.
.sframe filesThe .sframe file is the portable instrument file. It
keeps the validated metadata, the analysis plan, and the model in one
place.