- ポアソン分布らしい観測データがある
- ポアソン分布にフィットするかどうかは、こちらのような適合度検定でできる
- 期待値からポアソン分布のパラメタを求めて、そのパラメタ値の下での期待度数と観測度数のずれをカイ二乗統計量にして検定している
- 分布パラメタの値を推定するには、上のように期待値から出すのもよいのだと思うけれど、最適化関数とかを使うとどうなるだろう?
- optim()関数をつかってやってみる
- 期待値の小さいセルの合併は省略してあることに注意
my.pois <- function(x){
sum((dpois(0:M,x) * sum(tmp.X) - tmp.X)^2)
}
my.pois2 <- function(x){
exps <- dpois(0:M,x) * sum(tmp.X)
sum((exps - tmp.X)^2/exps
}
my.pois3 <- function(x){
p <- dpois(0:M,x)
abs(sum(tmp.X*log(p)))
}
- 期待値からの算術計算の結果が最尤推定値になっているようだ
M <- 500
G <- 100
L <- sample(500:1000,G,replace=TRUE)
mus <- rexp(G,3)
X <- matrix(0,G,M+1)
for(i in 1:G){
tmp.prob <- dpois(0:M,mus[i])
tmp.prob <- tmp.prob * (1+runif(M+1)*1)
tmp.prob <- tmp.prob/sum(tmp.prob)
tmp <- sample(0:M,L[i],replace=TRUE,prob = tmp.prob)
X[i,] <- c(length(which(tmp==0)),tabulate(tmp,nbins=M))
}
my.pois <- function(x){
sum((dpois(0:M,x) * sum(tmp.X) - tmp.X)^2)
}
my.pois2 <- function(x){
exps <- dpois(0:M,x) * sum(tmp.X)
non.zero <- which(exps!=0)
sum((exps[non.zero] - tmp.X[non.zero])^2/exps[non.zero])
}
my.pois3 <- function(x){
p <- dpois(0:M,x)
non.zero <- which(p!=0)
abs(sum(tmp.X[non.zero]*log(p[non.zero])))
}
pois.par <- pois.par2 <- pois.par3 <- pois.par4 <- rep(0,G)
for(i in 1:G){
tmp.X <- X[i,]
pois.par[i] <- optim(sum(tmp.X*(0:M))/sum(tmp.X),my.pois,lower=0,method="L-BFGS-B")$par
pois.par2[i] <- optim(sum(tmp.X*(0:M))/sum(tmp.X),my.pois2,lower=0,method="L-BFGS-B")$par
pois.par3[i] <- optim(sum(tmp.X*(0:M))/sum(tmp.X),my.pois3,lower=0,method="L-BFGS-B")$par
pois.par4[i] <- sum(tmp.X*(0:M))/sum(tmp.X)
}
matplot(t(X),type="l")
plot(data.frame(pois.par,pois.par2,pois.par3,pois.par4))
mlpoi<-function(p){
-(sum(x*log(p))-length(x)*p-sum(log(factorial(x))))
}
r_ml <- nlm(mlpoi, 0.5, hessian=TRUE)
print(sprintf("lambda:%1.5f variance:%1.5f iterations:%d", r_ml$estimate, 1/r_ml$hessian, r_ml$iterations))
sum(xtabs(~x)*0:4)/length(x)
M <- 40
G <- 100
L <- sample(1000:50000,G,replace=TRUE)
mus <- rep(1,G)
X <- matrix(0,G,M+1)
for(i in 1:G){
tmp.prob <- dpois(0:M,mus[i])
tmp.prob <- tmp.prob/sum(tmp.prob)
tmp <- sample(0:M,L[i],replace=TRUE,prob = tmp.prob)
X[i,] <- c(length(which(tmp==0)),tabulate(tmp,nbins=M))
}
Xw <- apply(X,2,sum)
pois.par <- sum(0:M * Xw)/sum(Xw)
pois.pars <- rep(0,G)
for(i in 1:G){
pois.pars[i] <- sum(0:M * X[i,])/sum(X[i,])
}
Lw <- Ls <- L.chisq <- p <- rep(0,G)
Lxw <- Lxs <- Lx.chisq <- px <- rep(0,G)
N.non.zero <- length(which(Xw != 0))
for(i in 1:G){
prob <- dpois(0:M,pois.par)
non.zero <- which(prob!=0)
Lw[i] <- sum(X[i,non.zero] * log(prob[non.zero]))
prob2 <- dpois(0:M,pois.pars[i])
non.zero2 <- which(prob2!=0)
Ls[i] <- sum(X[i,non.zero2] * log(prob2[non.zero2]))
probx <- Xw/sum(Xw)
non.zerox <- which(probx!=0)
Lxw[i] <- sum(X[i,non.zerox] * log(probx[non.zerox]))
prob2x <- X[i,]/sum(X[i,])
non.zero2x <- which(prob2x!=0)
Lxs[i] <- sum(X[i,non.zero2x] * log(prob2x[non.zero2x]))
}
L.chisq <- 2*(Ls - Lw)
p <- pchisq(L.chisq,1,lower.tail=FALSE)
Lx.chisq <- 2*(Lxs - Lxw)
px <- pchisq(Lx.chisq,N.non.zero,lower.tail=FALSE)
par(mfcol=c(2,3))
plot(Ls,Lw,main = "Log-Like two Hx")
plot(sort(L.chisq), main = "Chisq")
plot(sort(p), main ="p")
plot(L,L.chisq, main ="Length of genes vs. chisq")
plot(L,p, main = "Length of genes vs. p")
par(mfcol=c(1,1))
par(mfcol=c(2,3))
plot(Lxs,Lxw,main = "Log-Like two Hx")
plot(sort(Lx.chisq), main = "Chisq")
plot(sort(px), main ="p")
plot(L,Lx.chisq, main ="Length of genes vs. chisq")
plot(L,px, main = "Length of genes vs. p")
par(mfcol=c(1,1))