Description

The difference-from-control test is a type of discriminative test in which a control sample is presented alongside one or more test samples. Panelists are asked to evaluate how different each test sample is from the control, typically using an intensity scale. The goal is to determine whether the test samples differ significantly from the control.

Each panelist receives the control and one or more coded test samples. The samples are presented in randomized order, and panelists are asked to rate the degree of difference between each test sample and the control using a numerical scale (e.g., 0 = no difference, 10 = extremely different) (Meilgaard et al., 2015).

Example Description

A local bakery aims to optimize the recipe of its wheat bread to improve its texture. To this end, two new variants of the original recipe were developed:

Recipe A: Increased water proportion.

Recipe B: Use of a new yeast strain.

The study involved a total of 42 panelists, each acting as a block in the experimental design. Three types of bread were evaluated: a control sample made with the standard recipe, a sample made with Recipe A (featuring an increased proportion of water), and a sample made with Recipe B (using a new yeast strain). The main response variable was texture, which panelists rated on a 9-point scale, where 1 indicated very poor texture and 9 indicated excellent texture. Each panelist evaluated all three bread samples in separate sessions to minimize fatigue and carryover effects.

print(dfc)
## # A tibble: 126 × 3
##    Panelist Treatment Texture
##    <chr>    <chr>       <dbl>
##  1 1        Control         1
##  2 1        Recipe A        4
##  3 1        Recipe B        5
##  4 2        Control         3
##  5 2        Recipe A        6
##  6 2        Recipe B        7
##  7 3        Control         4
##  8 3        Recipe A        6
##  9 3        Recipe B        6
## 10 4        Control         3
## # ℹ 116 more rows

Statistical Analysis

To determine whether there are significant differences in texture between the bread samples, a two-way Analysis of Variance (ANOVA) is conducted. In this design, “Panelist” is treated as a blocking factor to account for individual differences in perception, while “Treatment” is the fixed effect of interest, representing the different bread recipes (Control, Recipe A, and Recipe B).

Before running the ANOVA, it is essential to ensure that both Panelist and Treatment are encoded as factors, so that R correctly interprets them as categorical variables. This allows the model to partition the variation appropriately between panelist effects and treatment effects.

The model is specified as follows:

dfc$Panelist <- as.factor(dfc$Panelist)
dfc$Treatment <- as.factor(dfc$Treatment)

res_anova <- aov(
  Texture ~ Panelist + Treatment,
  data = dfc
)

summary(res_anova)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Panelist    41 253.49    6.18    6.04 2.69e-12 ***
## Treatment    2 210.73  105.37  102.93  < 2e-16 ***
## Residuals   82  83.94    1.02                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

This output will provide the F-statistic and corresponding p-value for each source of variation, allowing us to assess whether the treatment (recipe) has a statistically significant effect on perceived texture.

Note: A common mistake is to omit the conversion of variables to factors. If Panelist or Treatment remain as numeric or character variables, R may incorrectly treat them as continuous predictors, which will distort the model structure and lead to misleading ANOVA results.

Dunnett’s Test

Since the ANOVA indicated a significant effect of treatment on perceived texture, we proceed with a Dunnett’s post-hoc test. This test is specifically designed for comparing multiple treatments against a single control, while adjusting for multiple comparisons. It is ideal for cases where the primary interest is to determine whether any of the modified recipes differ significantly from the standard version.

We use the multcomp package to perform this test.

library(multcomp)

res_anova <- aov(Texture ~ Panelist + Treatment, data = dfc)

dunnett_test <- glht(res_anova, linfct = mcp(Treatment = "Dunnett"))

summary(dunnett_test)
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Multiple Comparisons of Means: Dunnett Contrasts
## 
## 
## Fit: aov(formula = Texture ~ Panelist + Treatment, data = dfc)
## 
## Linear Hypotheses:
##                         Estimate Std. Error t value Pr(>|t|)    
## Recipe A - Control == 0   2.3810     0.2208   10.78   <1e-10 ***
## Recipe B - Control == 0   3.0000     0.2208   13.59   <1e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)

Note: Dunnett’s test only compares each treatment with the control. It does not test for differences between the treatments themselves (e.g., Recipe A vs. Recipe B).

References

Meilgaard, M., Civille, G. V., & Carr, B. T. (2015). Sensory evaluation techniques (5th ed.). CRC Press.