我有一个多变量方程,我在经过一些分析后得出结论。我想在R中以glm的形式写出这个等式。我这样做是为了能在这个等式上使用“预测”和其他函数。那可能吗?
以下是我的等式的详细信息
intercept:15.67
variable1 coefficient: -3.2
variable2 Coefficient -0.8
我知道这听起来很简单,但我找不到将方程式转换为glm的函数(类似“as.glm”!)这可能吗?
由于
答案 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")