Существует ли функция для создания матрицы дизайна для подмножества обучающих данных, в которых некоторые контрасты имеют только один уровень?

Фон

Я должен использовать очищенную версию моего объекта glm в приложении Shiny, потому что исходный объект модели слишком велик. Таким образом, я не могу генерировать стандартные ошибки предсказания через этот очищенный объект. Вместо этого мне придется использовать матрицу дисперсии-ковариации (которую я взял из исходного объекта модели) для расчета дисперсии прогноза/стандартных ошибок. В приложении я динамически генерирую гипотетические наблюдения, по которым хочу предсказать результаты и их стандартные ошибки.

Проблема

У меня осталась проблема создания соответствующей матрицы модели, которую я могу умножить на матрицу var-cov. Когда я использую model.matrix(), я часто получаю ошибки, потому что мои гипотетические данные не всегда имеют более одного уровня для факторных переменных. Я понимаю, что могу жестко закодировать некоторую логику, чтобы просто создать матрицу модели на основе моего понимания формулы модели. Но это похоже на то, что, вероятно, уже имело решение.

Я сделал простой пример, используя набор данных, похожий на мини-радужную оболочку, который выдает ошибку, о которой я говорю.

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

person MatthiasK    schedule 07.09.2017    source источник


Ответы (1)


Возможно, это был глупый вопрос. Но я понял, когда сделал этот пример с радужной оболочкой (с фактическим набором данных радужной оболочки), что model.matrix() на самом деле не выдает ошибку, если факторная переменная имеет более одного уровня (даже если она имеет только одно уникальное значение в гипотетическом образец). Поскольку в моем мини-примере необходимо создавать бинарные индикаторы для факторных переменных, 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(), но безрезультатно.

Если есть лучший способ, я был бы признателен, если бы кто-нибудь ответил! В противном случае, я надеюсь, что это поможет.

person MatthiasK    schedule 07.09.2017