在 R 中将等式写为 glm
Writing an equation as a glm in R
我有一个多变量方程,经过一些分析得出结论。我想在 R 中以 glm 的形式编写这个等式。我这样做是为了可以在这个等式上使用 "predict" 和其他函数。可以吗?
这是我的等式的详细信息
intercept:15.67
variable1 coefficient: -3.2
variable2 Coefficient -0.8
我知道这听起来很简单,但我找不到将方程式转换为 glm 的函数(类似于 "as.glm"!)这可能吗?
谢谢
这里是 class 的 线性 函数的快速破解。我相当确定某处一定存在更好的东西......但无论如何:
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
打印时。
如果你真的想要 generalised 线性模型,那么你必须在某处指定一个族(泊松,二项式等)和一个 link 函数。
我过去不得不这样做,所以我写了一个辅助函数来创建一个名为 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")
我有一个多变量方程,经过一些分析得出结论。我想在 R 中以 glm 的形式编写这个等式。我这样做是为了可以在这个等式上使用 "predict" 和其他函数。可以吗?
这是我的等式的详细信息
intercept:15.67
variable1 coefficient: -3.2
variable2 Coefficient -0.8
我知道这听起来很简单,但我找不到将方程式转换为 glm 的函数(类似于 "as.glm"!)这可能吗?
谢谢
这里是 class 的 线性 函数的快速破解。我相当确定某处一定存在更好的东西......但无论如何:
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
打印时。
如果你真的想要 generalised 线性模型,那么你必须在某处指定一个族(泊松,二项式等)和一个 link 函数。
我过去不得不这样做,所以我写了一个辅助函数来创建一个名为 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")