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

Coo*_*uck 2 r glm

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

例如,我知道当我使用family=poisson(link = "log")函数运行 GLM 时,我必须将预测值转换为exp(df$predictedvalue). 我该如何转型family=binomial(link = "logit")?我已经搜索过谷歌,但似乎无法找到执行此操作的代码。提前致谢!

Rei*_*son 6

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

例如:

> b <- binomial()
> b$linkinv
function (eta) 
.Call(C_logit_linkinv, eta)
<environment: namespace:stats>
Run Code Online (Sandbox Code Playgroud)

这是 logit 链接函数的逆函数,因为这是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)
Run Code Online (Sandbox Code Playgroud)

最后一行返回以下对象

> 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"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

对于使用族机制的更复杂模型,您可能会发现从拟合模型中提取相关信息更容易,如上所示,以便您获得适合您正在使用的实现的函数。