2013-08-19 2 views
7

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

Если я попытаюсь применить predict.lm() к новым данным, я получу сообщение о том, что фактор имеет новые уровни (это имеет смысл).

df <- data.frame(y=rnorm(100), x1=factor(rep(1:4,25))) 
lm1 <- lm(y ~ x1, data=df) 
newdata <- data.frame(y=rnorm(100), x1=factor(rep(1:5,20))) 
predict(lm1, newdata) 

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
    factor x2 has new levels 5 

Я мог бы сделать предсказание вручную, просто умножив коэффициенты на отдельные столбцы в data.frame. Однако это громоздко, учитывая, что в реальной модели, с которой я работаю, есть много переменных и терминов взаимодействия, и я хочу иметь возможность легко циклически выполнять различные спецификации модели, меняя формулу модели. Есть ли способ для меня существенно добавить новый коэффициент к объекту модели, а затем использовать его для составления прогнозов? Если нет, есть ли другой подход, который менее громоздкий, чем установка всего шага прогнозирования вручную?

+0

'? Update' может показать вам, как манипулировать формулой программно, не прибегая к использованию строк. – dardisco

+0

Немного больше о том, как вы хотите предсказать для своего нового уровня, было бы хорошо. «Некоторая взвешенная комбинация» не очень точная. –

+0

Если вы хотите попробовать это на многих моделях и с разными значениями коэффициентов для вашего дополнительного фактора, вы можете написать функцию для этого. Я бы попытался извлечь «model.matrix» и «коэффициенты» из объекта lm, вставить коэффициент и коэффициент фактора, а затем использовать умножение матрицы для получения прогнозов. – Edwin

ответ

1

Assumming вы хотите уровня 5, чтобы быть равномерно взвешенным, вы можете преобразовать в матрицу, подключить 25%, и умножить на коэффициенты из модели ...

n.mat <- model.matrix(~x1, data=newdata) 
n.mat[n.mat[,5] == 1, 2:4] <- .25 
n.mat <- n.mat[,-5] 
n.prediction <- n.mat %*% coef(lm1) 
0

Вот что вы мог бы сделать:

  1. Используя rbind, складывайте обучающие и тестовые наборы данных.
  2. Фактор предикторов.
  3. Разделите стек обратно на учебные и тестовые наборы данных.

Таким образом, все уровни будут присутствовать в обоих наборах данных.

Смежные вопросы