---
title: "Analysing survey responses: running the plan"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Analysing survey responses: running the plan}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
library(surveyframe)
```

The analysis in surveyframe is driven by the plan stored in the instrument.
Once responses are imported, scored, and checked, `run_analysis_plan()` runs
every research question in one pass and returns results formatted for reporting.

The worked-study vignette uses a published study whose data is private. This
vignette uses the bundled tourism demo, a synthetic dataset shaped around the
same digital marketing and tourism constructs, so the analysis runs end to end
without internet access or private data.

## Load the demo

```{r load}
demo      <- sframe_demo_data()
instr     <- demo$instrument
responses <- demo$responses

dim(responses)
```

## Import responses

Response data uses instrument item IDs as column names. Metadata columns are
declared explicitly. Use `strict = TRUE` to keep only known columns.

```{r import}
responses <- read_responses(
  demo$responses_path,
  instr,
  respondent_id = "respondent_id",
  submitted_at  = "submitted_at",
  meta_cols     = "started_at",
  strict        = TRUE
)

dim(responses)
```

## Missing data and quality

```{r screening}
missing_data_report(responses, instr)

quality_report(
  responses, instr,
  respondent_id = "respondent_id",
  submitted_at  = "submitted_at",
  started_at    = "started_at"
)
```

## Score scales

`run_analysis_plan()` scores the scales for you, but scoring once up front lets
you inspect the construct scores and run the assumption checks below.

```{r score}
scored    <- score_scales(responses, instr, keep_items = TRUE, keep_meta = TRUE)
scale_ids <- vapply(instr$scales, function(x) x$id, character(1))

head(scored[, intersect(scale_ids, names(scored)), drop = FALSE])
```

## Check assumptions before the plan

`assumption_report()` reports the checks a technique relies on, such as residual
normality, variance inflation, and influence for a regression.

```{r assumptions}
assumption_report(
  scored,
  predictors = c("digital_marketing", "service_quality", "sustainability"),
  outcome    = "satisfaction"
)
```

## Define the plan

Each block binds a research question to a technique and to the variables that
fill each role. A correlation expects `x` and `y`. A regression expects
`predictors` and a `dependent` variable. A group comparison expects a `group`
and an `outcome`.

```{r plan}
instr$analysis_plan <- list(
  list(id = "RQ1",
       research_question = "Is digital marketing perception associated with satisfaction?",
       family = "association", method = "correlation_pearson",
       roles = list(x = "digital_marketing", y = "satisfaction"),
       options = list(alpha = 0.05)),
  list(id = "RQ2",
       research_question = "Do the three perception scales predict satisfaction?",
       family = "regression", method = "regression_linear",
       roles = list(predictors = c("digital_marketing", "service_quality", "sustainability"),
                    dependent = "satisfaction"),
       options = list(alpha = 0.05)),
  list(id = "RQ3",
       research_question = "Do first-time and repeat visitors differ in behavioural intention?",
       family = "group_comparison", method = "mann_whitney",
       roles = list(group = "visit_type", outcome = "behavioural_intention"),
       options = list(alpha = 0.05))
)
```

## Run the plan

```{r run}
results <- run_analysis_plan(responses, instr)
results
```

## Read a single result

Each result holds more than the printed line. It carries the APA statistic, the
effect-size label where the technique reports one, a writing prompt, and the
references that support the technique.

```{r single-result}
rq1 <- results[[1]]

rq1$apa
rq1$effect_label
rq1$prompt
unlist(rq1$citations)
```

## Render the results report

`render_results()` writes a self-contained HTML report with one section per
research question, each holding the APA result, the writing prompt, a space for
the interpretation, and a reference list compiled from the techniques used.

```{r render, eval = FALSE}
render_results(results, instr, output_file = "results.html", citation_format = "apa")
```

## In SurveyStudio

SurveyStudio runs the same plan. Open it on the analysis screen, upload the
responses, and the Analysis Plan screen runs the saved plan and shows a table of
each question with its method and APA result. The full report is produced on the
Export screen.

```{r gui, eval = FALSE}
launch_studio(
  instrument     = instr,
  responses      = responses,
  screen         = "analysis",
  launch.browser = FALSE
)
```
