在R中将等式写成glm

时间:2015-01-13 15:14:11

标签: r glm prediction

我有一个多变量方程,我在经过一些分析后得出结论。我想在R中以glm的形式写出这个等式。我这样做是为了能在这个等式上使用“预测”和其他函数。那可能吗?

以下是我的等式的详细信息

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

我知道这听起来很简单,但我找不到将方程式转换为glm的函数(类似“as.glm”!)这可能吗?

由于

2 个答案:

答案 0 :(得分: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 :(得分:1)

我过去必须这样做,所以我写了一个辅助函数来创建一个名为makeglm的虚假glm对象。您需要设置一堆内容,以便您可以使用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")