R Possion Regression Analysis (ポアソン回帰)

ポアソン分布の前提3つ

-時間を細かく分けていくと、各時間帯で発生するイベントは1回だけである

-細かく分けた時間帯でのイベントの発生確率は同じである

-他の時間帯のイベントの発生状況の影響は受けない

-----------------------------------------------------------------------------------------------------------------

P(Y=k) = λ^k / k! × e^-λ (k=0,1,2…)

λは単位時間あたりのイベントの平均発生回数

単位時間あたりのイベントの発生関数の分散もλ

-----------------------------------------------------------------------------------------------------------------

ポアソン分布をパラメータを変えて描画

X <- NULL

K <- c(0.5, 1, 2, 5, 10)

col <- c("Red", "blue", "green", "black", "yellow")

 

for (j in K) {

  for (i in 1:8) {

    X[i] <- j^i / gamma(i+1) * exp(-j)    

  }

  par(new=T)

  

  if (j == 10) {

    plot(1:8, X[1:8], type="l", col=c(j), ylim=c(0,0.6),xlim=c(1,8))    

  } else {

    plot(1:8, X[1:8], type="l", col=c(j), ylim=c(0,0.6),xlim=c(1,8),ann=FALSE)        

  }

}

f:id:nakhirot:20130424191827p:plain

#λが増加すると、正規分布に近づく

 

t <- c(0:5)

x <- c(8,6,8,3,4,1)

m <- sum(x)

s <- t %*% x

r <- s / m

print(c(s, r))

 

ci <- c(r-2 * sqrt(r/m), r+2*sqrt(r/m))

 

x <- c(8,6,8,3,4,1)

names(x) <- c(0:5)

y <- dpois(c(0:5), lambda = r) * sum(x)

lines(barplot(x, ylim=c(0,10), col=rainbow(6)), y, type="l")

 

#Poisson分布への適合度をgoodfitで測定

#準備として、データをmaxrixに修正

 

x <- matrix(c(8,6,8,3,4,1,c(0:5)),nrow=6)

print(x)

 

library(vcd)

result <- goodfit(x, type = "poisson", method = "MinChisq")

#Chisqを最小化するようにpoisson式を当てはめ

print(result)

summary(result)

result$par

plot(result)

 

#日付毎の件数を入力する場合には、ベクトル形式として入力して

#goodfitを利用可

x <- c(0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,4,4,4,4,5)

library(vcd)

result <- goodfit(x, type="poisson", method="MinChisq")

plot(result)

 

############Poisson Regression Analysis############

boxplot(count ~ spray, data = InsectSprays)

#グラフを見ると、平均値が大きいほど、分散が大きいという

#ポアソン分布の性質が見られるので、ポアソン回帰を発想。

 

result <- glm(count ~ spray, data=InsectSprays, family ="poisson")

#logλ = a + b1x1 + b2x2 + … + bnxnとして推定値(a,b1,…,bn)

#を計算するモデル。名義変数の場合は、1変数を基準として、

#他の変数との差をパラメータb1, b2, …, bnとして推定する。

summary(result)

exp(result$coefficients)

 

cbind(InsectSprays, SurviveRate = predict(TN4, Titanic, type ="response"))

 

############オフセットによる調整法###############

accident <- c(45703,8906,7938,12091,7327,9820,11526,6525)

pref <- as.factor(c('A','B','C','D','E','F','G','H'))

result1 <- glm(accident~pref,family ="poisson")

result1

exp(result1$coefficients)

#A=福岡県,B=佐賀県,C=長崎県,D=熊本県,E=大分県,F=宮崎県,

#G=鹿児島県,H=沖縄県

#Aは人口が多いために交通事故が多いことを考慮すべき

 

pop <- c(5056, 859, 1453, 1828, 1203, 1143, 1730, 1373)

#各県の人口の対数

 

result2 <- glm(accident ~ pref, offset = log(pop), family = "poisson")

result2

exp(result2$coefficients)

#佐賀の方が交通事故の頻度が多いことが分かる

#offsetを加えてもAICは不変でるあることに注意

 

############過分散である場合の解析方法###############

#ポアソン回帰分析においては、過分散が問題となることがある。

#n個の回数データがあり、各回数に対するλは一定ではなく、

#ガンマ分布に沿って変動するものと考える。

#f(λ) = λ^a-1 * exp(-λ/b) /Γ(a)*b^a aをshapeパラメータ,bをscaleパラメータという

#λがガンマ分布に従い、yが平均λのポアソン分布に従うとすると、

#λの変動も含めたyの平均はab,分散はab(1+b)

 

set.seed(1)

n <- 1000

lambda <- rgamma(n, shape=5, scale=3) #

y <- rpois(n, lambda)

mean(y)

var(y)

 

#Γ分布のプロット(on progess)

X <- NULL

K <- rbind(c(1,1), c(2,3), c(3,2), c(4,5), c(5,4))

col <- c("Red", "blue", "green", "black", "yellow")

 

for (l in 1:5) {

    j = K[l,]

 

    for (i in 1:8) {

      X[i] <- i^(j[1]-1) * exp(-i/j[2]) / gamma(j[1])*j[2]^j[1]

    }

    par(new=T)

  

    if (l == 5) {

      plot(1:8, X[1:8], type="l", col=c(j), ylim=c(0,0.6),xlim=c(1,8))

      } else {

      plot(1:8, X[1:8], type="l", col=c(j), ylim=c(0,0.6),xlim=c(1,8),ann=FALSE)

    }

  }

 

#容量反応関係を表すデータの作成

set.seed(2)

n = 20

v = 3

dose <- c(0:4) * 5

x <- rep(dose, n)

a <- exp(3 + 0.05 * dose)/v

lambda <- rgamma(5 * n, shape = a, scale =v)

y <- rpois(5 *n, lambda)

dataNB <- data.frame(x,y)

boxplot(y ~ x, data = dataNB)

 

by(y, x ,mean)

by(y, x, var)

 

#上記のような、分散が平均に比べて大きなデータは、

#MASSパッケージのglm.nbを使う

 

glm.nb(y ~ x, data=dataNB)

 

##################練習問題######################

Y <- c(314,39,78,105,77,93,140,69)

X <- as.factor(c('福岡','佐賀','長崎','熊本','大分','宮崎','鹿児島','沖縄'))

result1 <- glm(formula = Y ~ X, family = 'poisson')

exp(result1$coefficients)

 

result2 <- glm(formula = Y ~ X, offset = log(pop), family = 'poisson')

exp(result2$coefficients)