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

时间:2017-09-07 22:03:42

标签: r model.matrix

背景

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

问题

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

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

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

1 个答案:

答案 0 :(得分:0)

也许这是一个愚蠢的问题。但我意识到,当我制作虹膜示例(使用实际的虹膜数据集)时,如果因子变量具有多个级别(即使它只有一个唯一值),model.matrix()实际上不会抛出错误假设的样本)。因为它需要为因子变量制作二进制指示器,所以在我的迷你示例中,model.matrix()没有潜在的参考水平。

我使用了清除过的模型&#34; xlevels&#34; object(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()&#34;对象&#34;中使用清除模型对象以及模型$ terms。输入,但无济于事。

如果有更好的方法,我会很感激有人回应!否则,我希望这有帮助。