在R中的GLM预测中转换族链接函数

时间:2018-01-18 22:46:25

标签: r glm

这可能是一个我无法找到的明显问题,但我正在为GLM的不同族/链接函数寻找不同的预测变换(在R代码中)。

示例我知道当我运行带有family=poisson(link = "log")函数的GLM时,我必须将我的预测值转换为exp(df$predictedvalue)。 如何转换family=binomial(link = "logit")?我已经搜索谷歌,但似乎无法找到代码来做到这一点。提前致谢!

1 个答案:

答案 0 :(得分:4)

规范方法是使用该系列的$linkinv组件。这是一个为所用系列提供链接函数反转的函数。

例如:

> b <- binomial()
> b$linkinv
function (eta) 
.Call(C_logit_linkinv, eta)
<environment: namespace:stats>

是logit link函数的反函数,因为它是binomial()的默认值。

您可以使用family()函数从拟合模型中提取族:

## from ?glm
clotting <- data.frame(u = c(5,10,15,20,30,40,60,80,100),
                       lot1 = c(118,58,42,35,27,25,21,19,18),
                       lot2 = c(69,35,26,21,18,16,13,12,12))
mod <- glm(lot1 ~ log(u), data = clotting, family = Gamma)
fam <- family(mod)

最后一行返回以下对象

> str(fam)
List of 12
 $ family    : chr "Gamma"
 $ link      : chr "inverse"
 $ linkfun   :function (mu)  
 $ linkinv   :function (eta)  
 $ variance  :function (mu)  
 $ dev.resids:function (y, mu, wt)  
 $ aic       :function (y, n, mu, wt, dev)  
 $ mu.eta    :function (eta)  
 $ initialize:  expression({  if (any(y <= 0))  stop("non-positive values not allowed for the 'gamma' family")  n <- rep.int(1, n| __truncated__
 $ validmu   :function (mu)  
 $ valideta  :function (eta)  
 $ simulate  :function (object, nsim)  
 - attr(*, "class")= chr "family"

linkinv组件是包含所用链接函数的反函数的函数,此处为反函数,因为这是函数Gamma的默认值。

如果您从此系列预测,您可以使用该功能将值转换为响应比例

> pred <- predict(mod, type = "link")
> fam$linkinv(pred)
        1         2         3         4         5         6         7         8 
122.85904  53.26389  40.00713  34.00264  28.06578  24.97221  21.61432  19.73182 
        9 
 18.48317

当然,如果您知道反函数是什么,您可以在基数R中找到它或编写自己的函数。前面提到的二项式族的logit链接函数的逆也可以在函数plogis()中找到。 exp()可用于log()链接。

对于使用家庭机制的更复杂的模型,您可能会发现如上所示从拟合模型中提取相关信息更容易,这样您就可以获得实现的正确功能使用