是否存在为训练数据的子集创建设计矩阵的现有函数,其中某些对比只有一个级别?

Is there an existing function to create a design matrix for a subset of the training data in which some contrasts have only one level?

背景

我必须在 Shiny 应用程序中使用我的 glm 对象的清除版本,因为原始模型对象太大。因此,我无法通过已清除的对象生成预测的标准误差。相反,我将不得不使用方差-协方差矩阵(我从原始模型对象中获取)来计算预测 variances/standard 误差。在该应用程序中,我动态生成我想要预测结果及其标准误差的假设观察结果。

问题

我剩下的问题是创建一个可以与 var-cov 矩阵相乘的相应模型矩阵。当我使用 model.matrix() 时,我经常会出错,因为我的假设数据并不总是具有超过一级的因子变量。我意识到我可以根据对模型公式的理解对一些逻辑进行硬编码来简单地制作模型矩阵。但这似乎可能已经有了解决方案。

我用一个类似虹膜的迷你数据集做了一个简单的例子,它抛出了我正在谈论的错误。

iris2 <- data.frame(Sepal.Length = c(3, 4), Species = c("setosa", "setosa"))
model.matrix( ~ Sepal.Length*Species, iris2)

也许这是一个愚蠢的问题。但是当我制作那个虹膜示例(使用实际的虹膜数据集)时我意识到,如果因子变量具有多个级别(即使它在假设样本)。因为它需要为因子变量制作二元指标,所以 model.matrix() 在我的小例子中没有潜在的参考水平。

我使用了清除模型的 "xlevels" 对象 (model$xlevels),遍历具有级别的变量,并像这样重构这些列:

for(i in 1:length(model$xlevels)){
newdata[[names(model$xlevels)[i]]] <- factor(newdata[[names(model$xlevels)[i]]], levels = model$xlevels[[i]])
}

请注意,我尝试在 model.matrix() 的 "object" 输入中使用已清除的模型对象以及模型 $terms,但无济于事。

如有更好的方法,望大侠解答!否则,我希望这对您有所帮助。