---
title: "Analyze and Visualize Important QOIs"
output: rmarkdown::html_vignette
description: >
How to estimate and correct marginal means (MMs) or average marginal component effects (AMCEs), including predicting IRR if necessary. Visualize these and other QOIs of interest.
vignette: >
%\VignetteIndexEntry{Analyze and Visualize Important QOIs}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r setup, include=FALSE}
library(projoint)
library(dplyr)
library(ggplot2)
library(patchwork)
```
## 🎯 Estimate Corrected MMs or AMCEs
In conjoint analysis, default MMs and AMCEs can be **biased** due to measurement error from intra-respondent variability.
**projoint** corrects for this bias automatically.
The following instructions apply to choice-level data. What if you have profile-level data?ⓘ Our FAQ Page has instructions to estimate and visualize profile-level QOIs.
---
## 📦 Prepare Example Data
> **Outcome naming & order (important)**
>
> - List `.outcomes` in the **order questions were asked**.
> - If you have a repeated task, its outcome must be the **last element**.
> - For base tasks (all but last), the function reads the **digits** in each name as the task id (e.g., `"choice4"`, `"Q4"`, `"task04"` → task 4).
> - The **repeated base task** is inferred from the **first base outcome’s digits**. The repeated outcome itself **need not** contain digits—only its position (last) matters.
> - Outcome strings should end with your choice labels; by default we parse the **last character** and expect `"A"`/`"B"`. If your survey uses `"1"`/`"2"` (or other endings), set `.choice_labels` accordingly.
**Examples**
```{r}
# Standard order; repeated = task 1
data("exampleData1")
outcomes <- c(paste0("choice", 1:8), "choice1_repeated_flipped")
out1 <- reshape_projoint(exampleData1, outcomes)
```
---
## 🛠️ Why Use IDs (e.g., `att1`, `level1`)?
Before estimating quantities, it’s important to understand how attribute and level IDs work inside projoint.
We recommend working with **attribute IDs** rather than actual text labels because:
- Safer against special characters, languages, or typos
- Allows **multiple attributes** to have identical labels (e.g., "High" for both "Teaching Quality" and "Research Quality")
Check attribute-level mappings:
```{r}
out1$labels
```
You can also save these labels for easier editing:
```r
save_labels(out1, "labels.csv")
```
---
## 📈 Estimate Marginal Means (MMs)
Choice-Level MMs (Specific Level)
Suppose you want to estimate, within a given profile pair, the probability of choosing a profile that includes "40% of pre-tax income" (`level3`) for Housing Cost (`att1`) rather than one that includes "15% of pre-tax income" (`level1`) for the same attribute, averaging over all combinations of the other attributes and across respondents; then use the following code:
```{r}
qoi <- set_qoi(
.structure = "choice_level",
.att_choose = "att1",
.lev_choose = "level3",
.att_notchoose = "att1",
.lev_notchoose = "level1"
)
mm2 <- projoint(out1, qoi)
print(mm2)
summary(mm2)
```
---
## 📉 Estimate AMCEs
Choice-Level AMCEs (Specific Level)
Suppose you want to quantify how the choice probability **changes** between the following profile pairs:
- choosing a profile that includes "40% of pre-tax income" (`level3`) for Housing Cost (`att1`) versus one that includes "15% of pre-tax income" (`level1`) for Housing Cost (`att1`); **and**
- [baseline] choosing a profile that includes "30% of pre-tax income" (`level2`) for Housing Cost (`att1`) versus one that includes "15% of pre-tax income" (`level1`) for Housing Cost (`att1`);
averaging over all combinations of the other attributes and across respondents. Then write the following code:
```{r}
qoi <- set_qoi(
.structure = "choice_level",
.estimand = "amce",
.att_choose = "att1",
.lev_choose = "level3",
.att_notchoose = "att1",
.lev_notchoose = "level1",
.att_choose_b = "att1",
.lev_choose_b = "level2",
.att_notchoose_b = "att1",
.lev_notchoose_b = "level1"
)
amce2 <- projoint(out1, qoi)
print(amce2)
summary(amce2)
```
---
## 🔎 Predict Intra-Respondent Reliability (IRR)
If your design **does not include** a repeated task, you can **predict** IRR using predict_tau(), based on observed respondent behavior.
Predict IRR Using `predict_tau()`
```{r}
data(out1_arranged)
predicted_irr <- predict_tau(out1_arranged)
print(predicted_irr)
summary(predicted_irr)
plot(predicted_irr)
```
---
```{r fig-setup, include=FALSE}
# Global default settings for all figures
knitr::opts_chunk$set(
fig.width = 6,
fig.height = 3,
fig.align = "center",
dpi = 300 # Optional: high-resolution plots
)
# Helper functions for special figure sizes
narrow_fig <- function() list(fig.width = 5, fig.height = 4)
wide_fig <- function() list(fig.width = 8, fig.height = 5)
tall_fig <- function() list(fig.width = 6, fig.height = 7)
```
```{r, echo=FALSE}
library(projoint)
library(ggplot2)
data(out1_arranged, package = "projoint")
```
## 🎨 Visualize MMs or AMCEs
The **projoint** package provides ready-to-publish plotting tools for conjoint analysis results.
Note: The current version of **projoint** supports plotting choice-level MMs only.
Support for **choice-level AMCEs** will be available in future updates!
---
### ⚖️ Choice-Level Analysis
Estimate
- Specify your quantity of interest:
```{r}
qoi_mm <- set_qoi(
.structure = "choice_level", # default
.att_choose = "att1",
.lev_choose = "level1",
.att_notchoose = "att1",
.lev_notchoose = "level3"
)
```
- Estimate
```{r}
choice_mm <- projoint(
.data = out1_arranged,
.qoi = qoi_mm,
.ignore_position = TRUE
)
```
Visualize (Levels)
```{r, fig.width = 6, fig.height = 3}
plot(choice_mm)
```
Visualize (Differences)
```{r, fig.width = 8, fig.height = 2}
plot(choice_mm, .type = "pointrange")
```
---
🏠 **Home:** [Home](https://yhoriuchi.github.io/projoint/index.html)