繁体   English   中英

手动从具有伽马分布的 GLM 和具有逆高斯分布的 GLM 获取响应

[英]Manually get the responses from GLM with gamma distribution and a GLM with inverse guassian distribution

我一直在尝试从 R 中的统计 package 中手动获取 predict.glm function 给出的响应值。 但是,我无法这样做。 我只知道如何使用二项分布手动获取值。 我真的很感激一些帮助。 我创建了两个小模型(一个带有 Gamma 族,一个带有逆高斯族)。

library(stats)
library(dplyr)

data("USArrests")

#Gamma distribution model
model_gam <- glm(Rape~Murder + Assault + UrbanPop, data=USArrests, family=Gamma)

print(summary(model_gam))
responses_gam <- model_gam %>% predict(USArrests[1,], type="response")
print(responses_gam)

#Trying to manually get responses for gamma model
paste(coef(model_gam), names(coef(model_gam)), sep="*", collapse="+")
# "0.108221470842499*(Intercept)+-0.00122165587689519*Murder+-9.47425665022909e-05*Assault+-0.000467789606041651*UrbanPop"
print(USArrests[1,])
#Murder: 13.2, Assault: 236, UrbanPop: 58
x = 0.108221470842499 - 0.00122165587689519 * 13.2 - 9.47425665022909e-05 * 236 - 0.000467789606041651 * 58
# This is wrong. Do I have to include the dispersion? (which is 0.10609)
print (exp(x)/(1+exp(x)))
# result should be (from predict function): 26.02872 
# exp(x)/(1+exp(x)) gives: 0.510649


# Gaussian distribution model

model_gaus <- glm(Rape~Murder + Assault + UrbanPop, data=USArrests, family=inverse.gaussian(link="log"))

responses_gaus <- model_gaus %>% predict(USArrests[1,], type="response")
print(summary(model_gaus))
print(responses_gaus)

#Trying to manually get responses for gaussian model
paste(coef(model_gaus), names(coef(model_gaus)), sep="*", collapse="+")
# "0.108221470842499*(Intercept)+-0.00122165587689519*Murder+-9.47425665022909e-05*Assault+-0.000467789606041651*UrbanPop"
x =  1.70049202188329-0.0326196928618521* 13.2 -0.00234379099421488*236-0.00991369000675323*58
# Dispersion in this case is 0.004390825
print(exp(x)/(1+exp(x)))
# result should be (from predict function): 26.02872 
# exp(x)/(1+exp(x)) it is: 0.5353866

内置predict()

predict(model_gaus)["Alabama"] ## 3.259201

用手

cat(paste(round(coef(model_gaus),5), names(coef(model_gaus)), sep="*", collapse="+"),"\n")
## 1.70049*(Intercept)+0.03262*Murder+0.00234*Assault+0.00991*UrbanPop
USArrests["Albama",]
##         Murder Assault UrbanPop Rape
## Alabama   13.2     236       58 21.2

截距的值总是 1,所以我们有

1.70049*1+0.03262*13.2+0.00234*236+0.00991*58 
## [1] 3.258094

(足够接近,因为我四舍五入了一些东西)

您不需要对色散或反向链接 function 做任何事情,因为高斯 model 使用身份链接。

使用 model 矩阵

在数学上,回归方程定义为X %*% beta ,其中beta是系数向量, Xmodel 矩阵(例如,它是截距加预测变量的一列;对于具有分类预测变量或更多的模型样条曲线等复杂术语,它有点复杂)。 您可以使用model.matrix()从矩阵中提取 model 矩阵:

Xg <- model.matrix(model_gaus)
drop(Xg["Alabama",] %*% coef(model_gaus))

对于 Gamma model,您将使用完全相同的过程,但最后您将计算的线性表达式(线性预测器)转换1/x (Gamma 的反向链接function)。 如果您使用日志链接,您将取幂。 更普遍,

invlinkfun <- family(fitted_model)$linkinv
X <- model.matrix(fitted_model)
beta <- coef(fitted_model)
invlinkfun(X %*% beta)

逆高斯 model 默认使用1/mu^2链接; inverse.gaussian()$linkinvfunction(eta) { 1/sqrt(eta) }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM