R 中 GLM 预测中的变换族 Link 函数
Transform Family Link Functions in GLM predictions in R
这可能是一个我找不到的明显问题,但我正在为 GLM 的不同 family/link 函数寻找不同的预测转换(在 R 代码中)。
示例我知道当我 运行 具有 family=poisson(link = "log")
函数的 GLM 时,我必须将我的预测值转换为 exp(df$predictedvalue)
。
如何转换 family=binomial(link = "logit")
?我搜索了 google,但似乎找不到执行此操作的代码。提前致谢!
规范的方法是使用家族的 $linkinv
组件。这是一个函数,它为所使用的系列提供 link 函数的反函数。
例如:
> 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)
最后一行returns以下对象
> 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
组件是包含所用 link 函数的反函数的函数,这里是反函数,因为这是 family 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
当然,如果您知道反函数是什么,您可能可以在 base R 中找到它或编写您自己的函数。例如,前面提到的二项式族的 logit link 函数的反函数也可以在函数 plogis()
中找到。 exp()
可用于 log()
link.
对于使用族机制的更复杂的模型,您可能会发现更容易从如上所示的拟合模型中提取相关信息,以便您获得适合 实现的函数 你正在使用。
这可能是一个我找不到的明显问题,但我正在为 GLM 的不同 family/link 函数寻找不同的预测转换(在 R 代码中)。
示例我知道当我 运行 具有 family=poisson(link = "log")
函数的 GLM 时,我必须将我的预测值转换为 exp(df$predictedvalue)
。
如何转换 family=binomial(link = "logit")
?我搜索了 google,但似乎找不到执行此操作的代码。提前致谢!
规范的方法是使用家族的 $linkinv
组件。这是一个函数,它为所使用的系列提供 link 函数的反函数。
例如:
> 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)
最后一行returns以下对象
> 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
组件是包含所用 link 函数的反函数的函数,这里是反函数,因为这是 family 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
当然,如果您知道反函数是什么,您可能可以在 base R 中找到它或编写您自己的函数。例如,前面提到的二项式族的 logit link 函数的反函数也可以在函数 plogis()
中找到。 exp()
可用于 log()
link.
对于使用族机制的更复杂的模型,您可能会发现更容易从如上所示的拟合模型中提取相关信息,以便您获得适合 实现的函数 你正在使用。