#Read in the data using readxl
library(tidyverse)
library(readr)
library(readxl)
grimes_fig1e <- read_xlsx("./data/grimes_fig1e.xlsx")Blog IMM-001: Reading Grimes et al.
Part I: oHSV alters the TME and increases MHCII on residual tumor cells - Fig. 1a - e
Citation
Grimes JM, Ghosh S, Manzoor S, Li LX, Moran MM, Clements JC, Alexander SD, Markert JM, Leavenworth JW. Oncolytic reprogramming of tumor microenvironment shapes CD4⁺ T-cell memory via the IL6ra-Bcl6 axis for targeted control of glioblastoma. Nature Communications. 2025;16:1095. Open access.
Why this paper matters
Glioblastoma multiforme (GBM) is the most common form of glioma, a type of primary brain cancer which has an incidence of about 25,000 new cases per year in the US adult population. Clinical management of GBM is faced with challenges including:
Getting therapeutics to cross the blood-brain barrier and reach tumor cells.
the ‘cold’ state of the tumor microenvironment which causes immunosuppression that is characteristic of GBM, this cold state is a notable immune evasion mechanism in GBM.
With the standard of care, GBM has a high rate of recurrence with aggressive regrowth.
In this study, Grimes et al. used an oncolytic herpes simplex virus (oHSV) expressing murine IL12 (M002) to show that in murine models of GBM (GSC005), M002 alters the tumor microenvironment. Specifically, the results showed that mice treated with M002 had fewer tumor cells and microglia and more T cells in the tumor microenvironment.
Clinically, these results suggest that oHSV has the potential to induce tumor cell killing and shift the immune state from immunosuppressive ‘cold’ to immunostimulatory ‘hot’ by increasing the T cell infiltration into the TME and increasing the MHC class II (MHCII) expression on intratumoral cells including residual tumor cells. Increased MHCII expression, including on residual tumor cells may facilitate engagement with T cells and help suppress long-term recurrence.
While this study was in murine models, it holds promise for clinical management of GBM in humans and can potentially improve the outcomes for patients with this form of cancer.
Main scientific question
Primary question:
Can a neurotropic virus such as oHSV be engineered to alter the tumor microenvironment in glioblastoma multiforme and improve the therapeutic outcomes of patients with this form of cancer?
Mechanistic question:
By what mechanism does oHSV boost anti-tumor immune responses and how long does that immunity last?
Analysis Part I: Part I of this analysis will focus on result 1 from the paper.
Result 1: Treatment with oncolytic herpes simplex virus expressing murine IL12 (M002) alters the immunophenotype of the GBM tumor microenvironment in syngeneic murine models (GSC005) and upregulates the expression of MHCII molecules on residual tumor cells.
Study design for Fig. 1a-c

Schematic 1: Experimental workflow summarizing the in vivo design for Fig. 1a–c.
Fig. 1a-c:
Study Design: The authors used a controlled, cross-sectional in-vivo animal study to investigate changes to the tumor microenvironment following oHSV treatment using single-cell RNA-seq.
Syngeneic murine model: GSC005, a syngeneic murine GBM model in C57BL/6 (B6) mice.
Time point: day 45
N: M002 (n=3); saline (n=3)
Method: Single-cell RNA transcriptomics
Note: Although 15,241 cells were analyzed, the experimental unit is the mouse, not the cell.
Study design for Fig. 1d-e

Schematic 2: Experimental workflow summarizing the in vivo design for Fig. 1d-e.
Fig. 1d-e:
Study Design: The authors utilized a factorial, independent-samples experimental in vivo study design to investigate the correlation between oHSV treatment and MHCII expression on tumor cells using flow cytometry.
Syngeneic murine model: GSC005, a syngeneic murine GBM model in C57BL/6 (B6) mice.
Time point: days 2, 14, 30, and 41 (the paper’s figure legend refers to day 4.5 rather than day 2; here I follow the main-text wording for consistency with the narrative)
N: day 2 [M002 (n=5); saline (n=5)]; day 14 [M002 (n=6); saline (n=6)]; day 30 [M002 (n=5); saline (n=5)] and day 41 [M002 (n=6), saline (n=6)]
Note: The paper contains a discrepancy between day 2 in the main text and day 4.5 in the figure legend. In this journal review, I follow the main-text day 2 wording for consistency, while acknowledging the discrepancy.
Method: Flow cytometry
Methods explained
Single-Cell RNA-seq
In summary, single cell RNA-seq (scRNA-seq) was used in this paper (Fig 1a, 1b & 1c) to analyze the cellular makeup of the tumor microenvironment and to characterize treatment-associated changes that might modulate immune responses to oHSV.
Flow cytometry
Additionally, flow cytometry was used to measure the frequency of MHCII-positive tumor cells and the fluorescence intensity of MHCII expression in those cells.
Key results
Key definitions the authors used:
T cells: Cells with cd3e and cd3g > 1
Myeloid cells: All myeloid cells except dendritic cells (DCs)
Non-T CD45+ cells: CD45⁺ cells except T, myeloid and microglia
Other CD45- cells: CD45⁻ cells except tumor cells
Part I: Key findings from these assays include:
- oHSV treatment restructured the immune phenotype of the GBM microenvironment by increasing T cells and decreasing tumor cells and microglia. It also significantly upregulated MHCII expression on residual tumor cells in oHSV-treated mice.
Results Explained
Based on Fig. 1a-e:
- Overall, oHSV treatment restructured the immune phenotype of the GBM microenvironment by decreasing tumor cells and microglia and increasing T cells. Furthermore, it increased the expression of MHCII on residual tumor cells.
Fig. 1a-b interpretation: The authors analyzed 15,241 cells following scRNA-sequencing:
In Fig. 1a, UMAP dimensionality reduction was used to cluster the cells based on cell markers. The UMAP analysis showed distinct cell populations including tumor cells, T cells, non-T CD45⁺ cells, other CD45⁻ cells, myeloid cells and microglia present in the TME of both M002- and saline-treated mice.
In Fig. 1b, compared to saline-treated mice, the relative proportion of T cells and non-T CD45⁺ cells increased, while the relative proportion of tumor cells and microglia decreased in M002-treated mice, demonstrating an altered immune profile following oHSV treatment. Together, these changes are consistent with a restructuring of the TME from a colder to a more inflamed state, marked by increased T-cell infiltration and evidence of tumor-cell killing following oHSV treatment.
Fig. 1c interpretation: The authors then examined MHCII-related gene expression across the 15,241-cell dataset in greater detail.
In Fig. 1c, overall, visual inspection suggests that M002 increased the expression of MHCII-related genes across several intratumoral cell populations. Specifically, we observe an M002-dependent increase in classical MHCII genes: H2-Ab1; H2-Aa, H2-Eb1 and in the non-classical MHCII gene: H2-DMb1 in non-T CD45⁺ cells. In microglial cells, we observe an M002-dependent increase in the expression of non-classical MHCII genes: H2-DMa; H2-DMb1 & H2-Oa. While in myeloid cells, we observe an M002-driven increase in classical MHCII genes: H2-Ab1, H2-Aa & H2-Ea. Notably, in tumor cells, an increase in M002-treated mice compared with controls is seen in the classical MHCII gene H2-Ab1.
Fig 1d-e interpretation:
Note: This interpretation is based on the two-way ANOVA performed here for teaching purposes, not on the unpaired Student’s t test reported by the authors in the paper.
Frequency vs time: Two-way ANOVA revealed no significant main effect of treatment on frequency of expression of MHCII, F(1,36) = 3.27, p = 0.0788, no significant main effect of day on expression of MHCII, F(3,36) = 1.10, p = 0.3636, and no significant treatment-by-day interaction, F(3,36) = 1.66, p = 0.1923.
MFI vs time: Two-way ANOVA on log-transformed MFI revealed a significant main effect of treatment, F(1,36) = 6.35, p = 0.0163, and a significant main effect of day, F(3,36) = 10.44, p = 4.38 × 10^-5, with no significant treatment × day interaction, F(3,36) = 0.824, p = 0.489. Residuals did not significantly deviate from normality after transformation (Shapiro–Wilk W = 0.964, p = 0.186), and Levene’s test showed no significant heterogeneity of variance (F(7,36) = 2.13, p = 0.065).
Although frequency showed no significant main effects or interaction, the log-transformed MFI showed significant main effects of treatment and day, indicating that the detectable signal was stronger for expression intensity than for the proportion of positive cells. This is likely reflective of a larger biological effect on per-cell expression.
Statistics explained (Fig. 1e Only)
The authors used the unpaired Student’s t test. The main assumptions of an unpaired Student’s t test include:
Independence of observations: In this study, that means each mouse should appear in only one group, treatment or control. Furthermore, and each mouse should be sampled once with no repeated measurements from the same mouse.
Continuous outcomes For this study, the Fig. 1e outcomes are continuous rather than discrete or categorical.
Approximately normal distribution within each group
Equal variances between groups
No extreme outliers
Although this study compares two independent groups, it also includes two factors: treatment (M002 vs Saline) and time after treatment (in days). A biologically important question is whether the treatment effect changes over time. For that reason, although the authors used an unpaired Student’s t test, an alternative teaching approach is to fit a two-way ANOVA, I present below.
NOTE:
This analysis uses the published mouse-level data as a teaching example for statistical comparison. The analysis shown here is not the authors’ original inferential workflow.
This section includes the R code used for exploratory data analysis, ANOVA, post hoc analysis where applicable, and visualization with jittered dot plots.
Here I used readxl to read in the data (Note: original data obtained directly from this paper was used).
Click here to view code for reading in excel spreadsheet
Here I subset the data to separate the frequency data from the mfi data
Click here to view code for subsetting data
#Subset the data to create two data sets for frequency and mfi
grimes1e.freq <- subset(grimes_fig1e, (outcome == "Frequency"))
grimes1e.mfi <- subset(grimes_fig1e, (outcome == "MFI"))Analyzing frequency data with two-way ANOVA
I first fit the two-way ANOVA model to the frequency data
Click here to view frequency ANOVA code
#Two-way ANOVA to assess main and interaction effects
grimes1e.freq$day <- factor(grimes1e.freq$day, levels = c("Day2", "Day14", "Day30", "Day41"))
grimes1e.freq$treatment <- factor(grimes1e.freq$treatment, levels = c("Saline", "M002"))
grimes1e.freq.model <- aov(value ~ treatment * day, data = grimes1e.freq)Result interpretation: The two-way ANOVA result showed no significant main effect of treatment and no evidence of a time-by-treatment interaction in this teaching analysis
Click to view raw frequency ANOVA output
summary(grimes1e.freq.model) Df Sum Sq Mean Sq F value Pr(>F)
treatment 1 545 544.9 3.273 0.0788 .
day 3 547 182.4 1.095 0.3636
treatment:day 3 830 276.8 1.662 0.1923
Residuals 36 5994 166.5
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Next, I checked whether the assumptions of the two-way ANOVA were reasonably met:
Normality of Residuals:
I started by examining whether the residuals were approximately normally distributed?
Next, I checked the normality assumption
Click here to view frequency Shapiro Wilk test code
#Shapiro Wilk test for normality
sw.f1e.freq<- shapiro.test(residuals(grimes1e.freq.model))Result Interpretation: The Shapiro-Wilk test gave p = 0.0915 which is greater than 0.05. Therefore, there is no significant evidence that the residuals deviate from normality. Additionally, the W statistic (0.956) is close to 1, consistent with approximate normality.
Click to view frequency Shapiro Wilk normality output
sw.f1e.freq
Shapiro-Wilk normality test
data: residuals(grimes1e.freq.model)
W = 0.95592, p-value = 0.09152
Q-Q Plot
Click here to view frequency Q-Q plot code
#Q-Q plots for visual inspection of normality
qqnorm(residuals(grimes1e.freq.model))
qqline(residuals(grimes1e.freq.model))
Result Interpretation The Q-Q plot provides a visual check of the residual distribution. From the Q-Q plot above, we observe that most point line close to the reference line, with a few deviations. On the right-hand side of the plot, we observe an upper right-hand tail and on the left-hand side of the plot, a little left-hand tail. Based on both the Q-Q plot and the Shapiro-Wilk test for normality suggests that the residuals are approximately normal and that the normality assumption is acceptable.
Homoscedasticity
Then, I checked the equal variance assumption
Click here to view frequency Levene test code
#Levene test for variance
#| message: false
#| warning: false
library(car)Loading required package: carData
Attaching package: 'car'
The following object is masked from 'package:dplyr':
recode
The following object is masked from 'package:purrr':
some
lev.f1e.freq <- leveneTest(value ~ treatment * day, data = grimes1e.freq)Result Interpretation: Levene’s test assesses whether the variances are similar across groups. Here, p = 0.227 and F = 1.4221, so there is no significant evidence of unequal variances.
Click to view frequency Levene test for variance output
lev.f1e.freqLevene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 7 1.4224 0.2267
36
Overall interpretation: For MHCII frequency, the two-way ANOVA showed no significant main effect of treatment, F(1,36) = 3.27, p = 0.0788, no significant main effect of day, F(3,36) = 1.10, p = 0.3636, and no significant treatment-by-day interaction, F(3,36) = 1.66, p = 0.1923.
Visualizing MHCII Frequency over time
Next, I visualized the data
Click here to view code for frequency vs time jittered dot plot
mhcii.freq.plot <- ggplot(grimes1e.freq,
aes(x = factor(day), y = value, color = treatment)) +
geom_point(
aes(fill = treatment),
position = position_jitterdodge(jitter.width = 0.08, dodge.width = 0.45),
shape = 21,
size = 3,
stroke = 1,
alpha = 0.9
) +
stat_summary(
fun = median,
geom = "point",
position = position_dodge(width = 0.45),
shape = 95,
size = 8
) +
stat_summary(
fun.data = median_hilow,
fun.args = list(conf.int = 0.5),
geom = "linerange",
position = position_dodge(width = 0.45),
linewidth = 0.8
) +
scale_color_manual(values = c("Saline" = "#00cc99", "M002" = "#024A86")) +
scale_fill_manual(values = c("Saline" = "white", "M002" = "white")) +
scale_y_continuous(limits = c(0, 75), expand = c(0, 0)) +
labs(
x = "days Post-Treatment",
y = "%MHCII+CD45-GFP+",
color = "Treatment",
fill = "Treatment"
) +
theme_classic(base_size = 14)mhcii.freq.plot
Attribution: Replotted from data reported in Grimes et al., Nature Communications (2025). Plot style and statistical analysis in this tutorial differ from the original publication.
MHCII Freq Interpretation: For the frequency of MHCII-positive CD45⁻GFP⁺ cells, the two-way ANOVA showed no statistically significant main effect of treatment, F(1,36)=3.27, p=0.0788, no significant main effect of day, F(3,36)=1.10, p=0.3636, and no significant treatment-by-day interaction, F(3,36)=1.66, p=0.1923. Model assumptions were reasonably met (Shapiro–Wilk W=0.956, p=0.0915; Levene’s test F(7,36)=1.42, p=0.2267).
Analyzing MFI data with two-way ANOVA
Here, I first fit the two-way ANOVA model to the mean fluorescence intensity (mfi) data
Click here to view mfi ANOVA code
#Two-way ANOVA to assess main and interaction effects
grimes1e.mfi$day <- factor(grimes1e.mfi$day, levels = c("Day2", "Day14", "Day30", "Day41"))
grimes1e.mfi$treatment <- factor(grimes1e.mfi$treatment, levels = c("Saline", "M002"))
grimes1e.mfi.model <- aov(value ~ treatment * day, data = grimes1e.mfi)Result interpretation: The initial two-way ANOVA for raw MFI suggested a significant main effect of treatment, with no evidence of a time-by-treatment interaction in this teaching analysis
Click to view raw mfi ANOVA output
summary(grimes1e.mfi.model) Df Sum Sq Mean Sq F value Pr(>F)
treatment 1 1090530 1090530 5.493 0.02473 *
day 3 4591097 1530366 7.709 0.00042 ***
treatment:day 3 170618 56873 0.286 0.83483
Residuals 36 7146696 198519
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Normality of Residuals:
Next, I checked the normality assumption
Click here to view mfi Shapiro Wilk test code
sw.f1e.mfi <- shapiro.test(residuals(grimes1e.mfi.model))Result Interpretation: The Shapiro-Wilk test gave p = 0.000959, which is less than 0.05, so we reject the null hypothesis of normality. This indicates that the raw MFI residuals are not normally distributed.
Click here to view mfi Shapiro Wilk normality output
sw.f1e.mfi
Shapiro-Wilk normality test
data: residuals(grimes1e.mfi.model)
W = 0.8982, p-value = 0.0009588
Q-Q Plot
Click here to view mfi Q-Q plot code
qqnorm(residuals(grimes1e.mfi.model))
qqline(residuals(grimes1e.mfi.model))
Result interpretation: The Q–Q plot shows a clear outlier in the right tail and noticeable deviations from the reference line, which is consistent with the Shapiro–Wilk result indicating non-normal residuals.
Homoscedasticity
Then, I checked the equal variance assumption
Click here to view mfi Levene test for variance code
lev.f1e.mfi <- leveneTest(value ~ treatment * day, data = grimes1e.mfi)Result Interpretation: Levene’s test was not statistically significant, F(7,36) = 2.20, p = 0.057, thus there is no significant evidence of unequal variances across the groups.
Click here to view mfi Levene test output
lev.f1e.mfiLevene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 7 2.2035 0.05707 .
36
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Since the normality assumption was violated, we can transform the data to see if the transformed data will be reasonably normally distributed. Thus, we first try a log transformation.
Log-transformation of MFI model
Because the raw MFI residuals were non-normal, I applied a log transformation to the raw data
Click here to view the mfi log-transformation code
#Log transformation of mfi variable
grimes1e.mfi$log_value <- log(grimes1e.mfi$value)Two-way ANOVA of Log-transformed MFI variable
Then, I refit the two-way ANOVA model to the log of mean fluorescence intensity (mfi)
Click here to view log-transformed mfi ANOVA code
grimes1e.mfi.log.model <- aov(log_value ~ treatment * day, data = grimes1e.mfi)Result interpretation: The two-way ANOVA result, of the log-transformed mfi data, below showed a significant main effect of treatment, with no evidence of a time-by-treatment interaction in this teaching analysis.
Click here to view log-transformed mfi ANOVA output
summary(grimes1e.mfi.log.model) Df Sum Sq Mean Sq F value Pr(>F)
treatment 1 0.3356 0.3356 6.352 0.0163 *
day 3 1.6550 0.5517 10.442 4.38e-05 ***
treatment:day 3 0.1306 0.0435 0.824 0.4894
Residuals 36 1.9020 0.0528
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Normality of Residuals:
Next, I checked the normality assumption of the residuals of the log-transformed data
Click here to view log-transformed mfi Shapiro Wilk test code
sw.f1e.logmfi <- shapiro.test(residuals(grimes1e.mfi.log.model))Result Interpretation: The Shapiro–Wilk test for the log-transformed model gave p = 0.1863, which is greater than 0.05. Therefore, there is no significant evidence that the residuals deviate from normality after log transformation.
Click here to view log-transformed mfi Shapiro Wilk normality output
sw.f1e.logmfi
Shapiro-Wilk normality test
data: residuals(grimes1e.mfi.log.model)
W = 0.96419, p-value = 0.1863
Q-Q Plots
Click here to view the log-transformed mfi Q-Q plot code
qqnorm(residuals(grimes1e.mfi.log.model))
qqline(residuals(grimes1e.mfi.log.model))
Result Interpretation: Levene’s test for the log-transformed model gave p = 0.065 and F = 2.131, so there is no significant evidence of unequal variances across groups.
Homoscedasticity
Then, I checked the equal variance assumption of the log-transformed data
Click here to view log-transformed mfi Levene test code
library(car)
lev.f1e.logmfi <- leveneTest(log_value ~ treatment * day, data = grimes1e.mfi)Result Interpretation: The p = 0.065 > 0.05 and F statistic is 2.131, thus we do not reject homogeneity of variance. There is therefore no significant evidence of unequal variances across the groups.
Click here to view the log-transformed mfi Levene test for variance output
lev.f1e.logmfiLevene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 7 2.1314 0.06497 .
36
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Post-hoc analysis
Because the model assumptions were reasonably satisfied after log transformation, I then used post hoc comparisons to interpret the significant main effects.
Post-hoc analysis for day
I then used post hoc comparisons to interpret the significant main effects
Click here to view post hoc analysis for day code
library(emmeans)
ph.day.f1e.logmfi <- emmeans(grimes1e.mfi.log.model, pairwise ~ day, adjust = "tukey")Result Interpretation: Tukey-adjusted post hoc comparisons showed that log(MFI) was significantly higher on day 30 and day 41 than at day 14, and significantly higher on day 30 and day 41 than at day 2. No significant differences were detected between day 2 and day 14 or between day 30 and day 41.
Click here to view post hoc analysis for day output
ph.day.f1e.logmfi$emmeans
day emmean SE df lower.CL upper.CL
Day2 7.25 0.0727 36 7.11 7.40
Day14 7.13 0.0664 36 6.99 7.26
Day30 7.53 0.0727 36 7.39 7.68
Day41 7.58 0.0664 36 7.45 7.72
Results are averaged over the levels of: treatment
Confidence level used: 0.95
$contrasts
contrast estimate SE df t.ratio p.value
Day2 - Day14 0.1271 0.0984 36 1.291 0.5744
Day2 - Day30 -0.2801 0.1030 36 -2.725 0.0465
Day2 - Day41 -0.3286 0.0984 36 -3.339 0.0101
Day14 - Day30 -0.4072 0.0984 36 -4.137 0.0011
Day14 - Day41 -0.4557 0.0938 36 -4.856 0.0001
Day30 - Day41 -0.0485 0.0984 36 -0.493 0.9603
Results are averaged over the levels of: treatment
P value adjustment: tukey method for comparing a family of 4 estimates
Treatment marginal means
Click here to view post hoc analysis for treatment code
ph.treatment.f1e.logmfi <- emmeans(grimes1e.mfi.log.model, pairwise ~ treatment)NOTE: Results may be misleading due to involvement in interactions
Result Interpretation: Estimated marginal means showed that log(MFI) was significantly higher in M002 than in Saline when averaged across days (difference = 0.165, p = 0.0229).
Click here to view post hoc analysis for treatment output
ph.treatment.f1e.logmfi$emmeans
treatment emmean SE df lower.CL upper.CL
Saline 7.29 0.0492 36 7.19 7.39
M002 7.46 0.0492 36 7.36 7.56
Results are averaged over the levels of: day
Confidence level used: 0.95
$contrasts
contrast estimate SE df t.ratio p.value
Saline - M002 -0.165 0.0696 36 -2.377 0.0229
Results are averaged over the levels of: day
Treatment comparisons within each day
Click here to view post hoc within day code
ph.wday.f1e.logmfi <- emmeans(grimes1e.mfi.log.model, pairwise ~ treatment | day, adjust = "holm")Result Interpretation: Exploratory within-day comparisons suggested a significant M002 vs Saline difference at day 14, although the overall treatment-by-day interaction was not significant.
Click here to view post hoc within day output
ph.wday.f1e.logmfi$emmeans
day = Day2:
treatment emmean SE df lower.CL upper.CL
Saline 7.22 0.1030 36 7.01 7.43
M002 7.29 0.1030 36 7.08 7.50
day = Day14:
treatment emmean SE df lower.CL upper.CL
Saline 6.97 0.0938 36 6.77 7.16
M002 7.29 0.0938 36 7.10 7.48
day = Day30:
treatment emmean SE df lower.CL upper.CL
Saline 7.50 0.1030 36 7.30 7.71
M002 7.56 0.1030 36 7.35 7.77
day = Day41:
treatment emmean SE df lower.CL upper.CL
Saline 7.48 0.0938 36 7.28 7.67
M002 7.69 0.0938 36 7.50 7.88
Confidence level used: 0.95
$contrasts
day = Day2:
contrast estimate SE df t.ratio p.value
Saline - M002 -0.0689 0.145 36 -0.474 0.6385
day = Day14:
contrast estimate SE df t.ratio p.value
Saline - M002 -0.3213 0.133 36 -2.421 0.0206
day = Day30:
contrast estimate SE df t.ratio p.value
Saline - M002 -0.0586 0.145 36 -0.403 0.6892
day = Day41:
contrast estimate SE df t.ratio p.value
Saline - M002 -0.2128 0.133 36 -1.604 0.1175
Overall Interpretation of ANOVA model: Residuals from the raw MFI model deviated from normality, MFI values were log-transformed prior to analysis. Two-way ANOVA on log-transformed MFI revealed a significant main effect of treatment, F(1,36) = 6.35, p = 0.0163, and a significant main effect of day, F(3,36) = 10.44, p = 4.38 × 10^-5, with no significant treatment × day interaction, F(3,36) = 0.824, p = 0.489. Residuals did not significantly deviate from normality after transformation (Shapiro–Wilk W = 0.964, p = 0.186), and Levene’s test showed no significant heterogeneity of variance (F(7,36) = 2.13, p = 0.065).
Visualizing MHCII MFI over time
Next, I visualized the data
Click here to view code for mfi vs time jittered dot plot code
mhcii.mfi.plot <- ggplot(grimes1e.mfi,
aes(x = factor(day), y = value, color = treatment)) +
geom_point(
aes(fill = treatment),
position = position_jitterdodge(jitter.width = 0.08, dodge.width = 0.45),
shape = 21,
size = 3,
stroke = 1,
alpha = 0.9
) +
stat_summary(
fun = median,
geom = "point",
position = position_dodge(width = 0.45),
shape = 95,
size = 8
) +
stat_summary(
fun.data = median_hilow,
fun.args = list(conf.int = 0.5),
geom = "linerange",
position = position_dodge(width = 0.45),
linewidth = 0.8
) +
scale_color_manual(values = c("Saline" = "#00cc99", "M002" = "#024A86")) +
scale_fill_manual(values = c("Saline" = "white", "M002" = "white")) +
scale_y_continuous(limits = c(0, 4000), expand = c(0, 0)) +
labs(
x = "days Post-Treatment",
y = "MHCII MFI",
color = "Treatment",
fill = "Treatment"
) +
theme_classic(base_size = 14)mhcii.mfi.plot
Attribution: Replotted from data reported in Grimes et al., Nature Communications (2025). Plot style and statistical analysis in this tutorial differ from the original publication.
MHCII MFI Interpretation: For MHCII MFI in CD45⁻GFP⁺ cells, the raw-data model showed non-normal residuals, so MFI values were log-transformed before analysis. The two-way ANOVA of log-transformed MFI revealed a significant main effect of treatment F(1,36)=6.35, p=0.0163, and a significant main effect of day F(3,36)=10.44, p=4.38×10⁻⁵, with no significant treatment-by-day interaction, F(3,36)=0.824, p=0.4894. After transformation, the model assumptions were reasonably satisfied (Shapiro–Wilk W=0.964, p=0.186; Levene’s test F(7,36)=2.13, p=0.065). Tukey-adjusted post hoc comparisons indicated that MFI was higher at days 30 and 41 than at days 2 and 14, and estimated marginal means averaged across days showed that MFI was significantly higher in M002 than in Saline (p=0.0229). Here, MHCII refers to Major Histocompatibility Complex class II, and MFI refers to mean fluorescence intensity.
Strengths
Focusing on only result 1, some strengths include:
- The study design.
and
- Biological relevance (From transcription to translation): First, the authors addressed the question of how M002 treatment alters the tumor microenvironment. They used scRNA-seq to cluster the cells and evaluate any changes to cell-type proportions. After identifying the key alterations, decreased tumor cells, suggestive of virus-mediated tumor killing, and increased T cells, they then profiled the residual tumor cells and found that MHCII pathway genes were upregulated within the tumor microenvironment, with particular interest is the increased expression observed in tumor cells.
Because Fig. 1a-c focus on the transcriptional level, the authors next interrogated these MHCII alterations at the protein level using flow cytometry to assess the frequency and magnitude of MHCII expression at different time points in M002-treated and saline-treated mice.
Limitations
Fig1a-e:
Pooled tumor samples eliminate mouse-to-mouse variability from the data
1:1 ratio of CD45+:CD45- cells: Mixing CD45+ and CD45- cells at a 1:1 ratio before sequencing does not preserve the true in vivo proportionality of these cell compartments.
The late collection time point (day 45), together with the fact that it is the only scRNA-seq time point, does not provide insight into when TME reprogramming is first induced.
These experiments were performed in murine models of glioblastoma, so any translation to human cases of GBM is inferential at best.
In summary…
This paper by Grimes et al. presents a promising therapeutic approach to managing glioblastoma multiforme using an oncolytic herpes simplex virus. An important immune evasion mechanism employed by tumor cells in glioma is to retain the tumor microenvironment in a cold state. A cold TME is one underlying reason for the poor prognosis of this disease. Grimes et al. investigated the association between treating GBM with an oHSV expressing murine IL12 (M002) and an altered TME in GSC005 murine models of GBM. Fig. 1a-e show that oHSV treatment:
Alters the TME by increasing T-cell infiltration consistent with a shift toward a more inflamed or ‘hotter’ tumor microenvironment.
Decreases tumor-cell abundance, suggestive of active tumor killing.
Shifts the distribution of MHCII-related genes by increasing their expression across non-T CD45+, microglial, myeloid and tumor cells.
Increases the magnitude of MHCII expression on tumor cells
Questions for further consideration
Think about these questions, feel free to answer them. I will discuss them in future posts.
What is GSC005 and why is it a useful model for studying glioblastoma in mice?
What markers define the following cell populations?
T cells
Non-T CD45+ cells
Microglial cells
Myeloid cells
Tumor cells
Other CD45- cells
Why do you think the authors excluded T cells from the analysis in Fig 1c?
The authors found that the magnitude of MHCII expression on tumor cells increased as a result of oHSV treatment. Why do you think this is important?
What are the main differences between an unpaired Student’s t test and a two-way ANOVA?
References and image credits
This tutorial is inspired by:
Grimes JM, Ghosh S, Manzoor S, Li LX, Moran MM, Clements JC, Alexander SD, Markert JM, Leavenworth JW. Oncolytic reprogramming of tumor microenvironment shapes CD4⁺ T-cell memory via the IL6ra-Bcl6 axis for targeted control of glioblastoma. Nature Communications. 2025;16:1095. Open access.
All tutorial UMAPs, stacked bar plots, violin plots, and program-score plots shown here are simulated examples created for teaching purposes and are not reproduced from the original paper, except where explicitly noted.
Where I use the paper’s reported real data (for example, replotting Fig. 1e-style measurements for teaching statistics), those plots are my own reanalysis/revisualization of data reported in Grimes et al. and not the original published figure design. Any alternative statistical tests shown in this tutorial are my own teaching analysis and may differ from the statistical methods reported in the original paper.