簡體   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