廣義線性迴歸模型之泊松迴歸(logit/probit迴歸)—R語言實現+仙客來數據集+交叉驗證

Poisson迴歸模型

Poisson迴歸也是廣義線性迴歸模型中的一中,詳細介紹可見之前的博客:
https://blog.csdn.net/qq_42871249/article/details/104339650
在這裏插入圖片描述

使用 Poisson迴歸模型時的兩個問題

由於廣義線性模型的假定很強, 所以當實際數據與假定的分佈不符時會產生一些問題. Poisson迴歸模型也不例外, 人們目前主要關注的是 以下兩個問題:

一、散佈問題

在Poisson迴歸模型中, 假定方差和均值相等, 當方差大於或小於 均值時就會出現過散佈(overdispersion)問題或欠散佈 (underdispersion) 問題. 使用 Poisson迴歸模型時出現的散佈問題的最簡單解決辦法是使用提到的準 Poisson迴歸模型, 而且還可以說明方差和均值的關係。準 Poisson 模型擬合代碼示例:
glm(y~.,data,family=quasi(variance=“mu^2”,link=“log”))
這裏的選項variance=“mu^2” 就把方差看成隨着均值平方變化的函數, 這個選項可以輸入"constant", “mu(1-mu)”, “mu”, “mu^2”, “mu^3”, 等 等.

二、零膨脹問題

在這裏插入圖片描述

代碼介紹:

同樣使用:glm(formula, family = gaussian, data, weights, subset, na.action, start = NULL, etastart, mustart, offset, control = glm.control(…), model = TRUE, method = “glm.fit”, x = FALSE, y = TRUE, contrasts = NULL, …)
不同之處在於參數family=possion()

仙客來案例分析

仙客來數據集包含三個自變量,因變量是Flowers開花數目。
在這裏插入圖片描述
直接上代碼

w=read.csv("cyclamen.csv");n=nrow(w);m=ncol(w)
for(i in c(1,2,5))w[,i]=factor(w[,i])
table(w[,c(1,2,5)])

w=read.csv("cyclamen.csv");n=nrow(w)
for(i in c(1,2,5))w[,i]=factor(w[,i])
w=w[,-(3:4)]#不需要三行四行所以去掉
a=glm(Flowers~.,w,family=poisson)
summary(a)
anova(a,test="Chisq")#方差分析

b=step(a);summary(b)#用逐步迴歸法
anova(b,a,test="Chisq")

d=glm(b, w, family=quasipoisson(link = "log"))
anova(d,test="Chisq")

anova(d,test="Chisq")
anova(d,test="F")

glm(Flowers~.,data=w,family=quasi(variance="mu^2",link="log"))

下面做交叉驗證:
首先定義了交叉驗證的函數:Fold

Fold=function(Z=5,w,D,seed=7777){ 
  n=nrow(w);d=1:n;dd=list() 
  e=levels(w[,D]);T=length(e)#????��T??
  set.seed(seed)
  for(i in 1:T){
    d0=d[w[,D]==e[i]];j=length(d0)
    ZT=rep(1:Z,ceiling(j/Z))[1:j]
    id=cbind(sample(ZT,length(ZT)),d0);dd[[i]]=id}
 #上面每個dd[[i]]是隨機1:Z及i類的下標集組成的矩陣
  mm=list()
  for(i in 1:Z){u=NULL;
  for(j in 1:T)u=c(u,dd[[j]][dd[[j]][,1]==i,2])
  mm[[i]]=u} #mm[[i]]Ϊ??i???±꼯i=1,...,Z
  return(mm)}#????Z???±꼯

w=read.csv("cyclamen.csv")
for(i in c(1,2,5))w[,i]=factor(w[,i])
w=w[,-(3:4)];D=4;Z=10
mm=Fold(Z,L,1,8888)#L[,1]??96??ˮƽ?ķ?????��

library(nnet)
MSE=matrix(99,Z,3);J=1
for(i in 1:Z)
{m=mm[[i]];M=mean((w[m,D]-mean(w[m,D]))^2)
a=glm(Flowers ~ ., family="poisson", data=w[-m,])
y1=predict(a,w[m,],type="response")
MSE[i,J]=mean((w[m,D]-y1)^2)/M}

J=J+1;for(i in 1:Z)
{m=mm[[i]];M=mean((w[m,D]-mean(w[m,D]))^2)
a=lm(Flowers ~ .,w[-m,])
MSE[i,J]=mean((w[m,D]-predict(a,w[m,]))^2)/M}

J=J+1;for(i in 1:Z)
  set.seed(1010);for(i in 1:Z){
    m=mm[[i]];M=mean((w[m,D]-mean(w[m,D]))^2)
    a=nnet(w[-m,D]/max(w[,D])~.,data=w[-m,],size=50,decay=0.1) 
    MSE[i,J]=mean((w[m,D]-predict(a,w[m,])*max(w[,D]))^2)/M}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章