Вот быстрый хак класса линейных функций. Я совершенно уверен, что-то лучше, где-то должен существовать ... Но все равно:
linear <- function(betas){
betas = matrix(betas, ncol=1)
ret = list(
pred = function(z){
(cbind(1,z) %*% betas)[,1]
}
)
class(ret)="linear"
ret
}
predict.linear <- function(object, newdata, ...){
object$pred(newdata)
}
Тогда вы можете сделать:
> l1 = linear(c(15,1,2))
> predict(l1,cbind(1:10,12:21))
[1] 40 43 46 49 52 55 58 61 64 67
Который просто:
> 15 + 1*(1:10) + 2*(12:21)
[1] 40 43 46 49 52 55 58 61 64 67
т.е. перехватывать плюс пояснительная переменных *.
Обратите внимание, что это зависит от порядка столбцов в матрице, а не от имен переменных в кадре данных. Как я уже сказал, есть, вероятно, более эффективная и удобная реализация, поэтому я не хочу развивать это гораздо дальше. Есть способ печати:
print.linear <- function(x,...){
cat("Linear interpolator\n")
cat("Parameters: ",x$betas)
cat("\n")
invisible(0)
}
Так что теперь говорит:
> l1
Linear interpolator
Parameters: 15 1 2
при печати.
Если вы действительно хотите обобщенные линейные модели, то вам нужно будет указать семью (Пуассон, Биномиальный и т. Д.) И функцию связи там где-нибудь.
Это потому, что уравнение (обобщенной) линейной модели является лишь частью (обобщенной) линейной модели. Там есть всевозможные другие части, такие как остатки и отклонения, которых у вас нет. Таким образом, это должен был быть еще один класс объекта, хотя он все равно мог бы иметь метод «предсказать» ... – Spacedman
Мне это здорово! Не могли бы вы показать мне, как сделать это другим «объектом» или «классом»? – Error404