NDSolve and ParametricNDSolve both return lists of Rules. I find it more convenient to work with those lists of Rules than just a list of their Values (right hand sides) as is done in your code. This way I work directly with the variables I need rather than some part of a list. (In general I try to avoid using Part.)
I also find it easier to solve for the variables vi
rather than vi[t]
.
I made a couple changes to your code. In the first cell I used
seirCompartments = {\[ScriptCapitalS], \[ScriptCapitalE], \
\[ScriptCapitalI], \[ScriptCapitalR]};
and in the second cell I used
Plot[{\[ScriptCapitalS][\[Beta], \[Gamma], \[Sigma]][
t], \[ScriptCapitalR][\[Beta], \[Gamma], \[Sigma]][t]} /.
seirSolutions // Evaluate, {t, 0, tmax},
PlotRange -> {{0, tmax}, {0, ymax}}]
Attachments: