Это можно сделать, построив матрицу модели и умножив ее на вектор коэффициентов.
Предположим, это наша модельная формула. Species
является категориальной переменной:
> m = Sepal.Length~Petal.Length+Petal.Width+Species
Теперь создайте матрицу модели из этого и данных:
> mm = model.matrix(m, data=iris)
> head(mm)
(Intercept) Petal.Length Petal.Width Speciesversicolor Speciesvirginica
1 1 1.4 0.2 0 0
2 1 1.4 0.2 0 0
3 1 1.3 0.2 0 0
4 1 1.5 0.2 0 0
5 1 1.4 0.2 0 0
6 1 1.7 0.4 0 0
У Species
есть три уровня, и вы можете видеть, что все первые несколько строк имеют нули для столбцов двух видов, поэтому они относятся к другим видам.
Чтобы делать предсказания для некоторого набора из 5 коэффициентов, они должны быть в том же порядке, что и строки, и с одинаковым «ограничением», т.е. кодирование видов выполняется одинаково с двумя фиктивными переменными. Таким образом, ваши «бета» значения должны выглядеть так же, как и коэффициенты, которые вы получите от lm
данных:
> mfit = lm(m, data=iris)
> mfit$coefficients
(Intercept) Petal.Length Petal.Width Speciesversicolor
3.682982011 0.905945867 -0.005995401 -1.598361502
Speciesvirginica
-2.112646781
Теперь вы можете получать прогнозы для любого набора коэффициентов путем умножения матриц:
> head(mm %*% mfit$coefficients)
[,1]
1 4.950107
2 4.950107
3 4.859513
4 5.040702
5 4.950107
6 5.220692
Если я все сделал правильно, эти значения должны равняться выводу predict
:
> head(predict(mfit))
1 2 3 4 5 6
4.950107 4.950107 4.859513 5.040702 4.950107 5.220692
и если ваши коэффициенты отличаются, вы должны получить разные прогнозы с помощью умножения матриц:
> head(mm %*% c(0,1,.2,.2,.4))
[,1]
1 1.44
2 1.44
3 1.34
4 1.54
5 1.44
6 1.78