2015-01-13 5 views
0

У меня есть уравнение с несколькими переменными, которое я сделал после некоторого анализа. Я хотел бы написать это уравнение в виде glm в R. Я делаю это, чтобы я мог использовать «предсказание» и другие функции этого уравнения. Это возможно?Запись уравнения в виде glm в R

Вот подробности моего уравнения

intercept:15.67 
variable1 coefficient: -3.2 
variable2 Coefficient -0.8 

Я знаю, это звучит, как простая задача, но я не мог найти функцию, чтобы преобразовать уравнение в GLM (что-то вроде «as.glm»!) Это возможно?

Благодаря

+0

Это потому, что уравнение (обобщенной) линейной модели является лишь частью (обобщенной) линейной модели. Там есть всевозможные другие части, такие как остатки и отклонения, которых у вас нет. Таким образом, это должен был быть еще один класс объекта, хотя он все равно мог бы иметь метод «предсказать» ... – Spacedman

+0

Мне это здорово! Не могли бы вы показать мне, как сделать это другим «объектом» или «классом»? – Error404

ответ

2

Вот быстрый хак класса линейных функций. Я совершенно уверен, что-то лучше, где-то должен существовать ... Но все равно:

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 

при печати.

Если вы действительно хотите обобщенные линейные модели, то вам нужно будет указать семью (Пуассон, Биномиальный и т. Д.) И функцию связи там где-нибудь.

1

Мне пришлось сделать это в прошлом, поэтому я написал вспомогательную функцию для создания фальшивого объекта glm, который называется makeglm. Существует актуальный набор вещей, которые вам нужно настроить, чтобы вы могли использовать predict(), включая указание классов для столбцов. Сама функция запрашивает data.frame, из которой он может выводить типы данных. Вот пример того, как вы его используете.

#sample data 
set.seed(15) 
dd <- data.frame(
    X1=runif(50), 
    X2=factor(sample(letters[1:4], 50, replace=T)), 
    X3=rpois(50, 5), 
    Outcome = sample(0:1, 50, replace=T) 
) 

# fit standard model  
mymodel<-glm(Outcome~X1+X2+X3, data=dd, family=binomial) 
predict(mymodel, type="response") 

#create a "fake" model and still use predict 
newmodel <- makeglm(Outcome~X1+X2+X3, family=binomial, data=dd, 
    -.5, X1=1, X2=c(b=1.5, c=1, d=1.5), X3=-.15) 
predict(newmodel, newdata=dd, type="response") 
+1

Мы называем это «готовясь стрелять себе в ногу». Сбрасывание с внутренними объектами и до сих пор называющее его объектом этого класса очень непослушным. Не пытайтесь использовать 'installed (newmodel)' или 'остаток (newmodel)'. Мне нравится думать, что мы должны разработать для этого подходящие объекты, если такие вещи еще не существуют. До тех пор практика прыгает. – Spacedman