##１．平均感染ウイルスゲノム数の推定に用いるRスクリプト（r0=0.5）

##観測データ
n0<- 203; m0 <- 179; y0 <- 14; c0 <- 10
n1<- 946; m1 <- 787; y1 <- 77; c1 <- 82
n2<- 819; m2 <- 505; y2 <- 140; c2 <- 174

##初期設定
r0 <- 0.5
K <- 30　#ポワソン分布を仮定するkの最大値

##感染状態を記録するtableの作成
kv <- NULL
lv <- NULL
for (i in 0:K){
kv <- c(kv,rep(i,i+1))
lv <- c(lv,0:i)
}
klv <- kv-lv
lklv <- lv*klv
ln <- (K+2)*(K+1)/2
tablei <- matrix(rep(0,ln*5),ncol=5)
tablei[,1] <- kv #k
tablei[,2] <- lv #kゲノムのうち、RNA2-YFPの数l
tablei[,3] <- klv #kゲノムのうち、RNA2-CFPの数k-l
tablei[,4] <- lklv #k*(k-l); 0のとき、感染ゲノム数0

bottle <- function(lambda){
	lambda0 <- lambda[1]; lambda1 <- lambda[2];  lambda2 <- lambda[3]

	table0 <- tablei
	table0[,5] <- dpois(table0[,1],lambda0)*dbinom(table0[,2],table0[,1],r0)

	pni0 <- table0[1,5] #感染ウイルスゲノム数0のCell-0の比率
	py0 <- sum(table0[which(table0[,2]>0&table0[,3]==0),5])/(1-pni0) #RNA2-YFP単独感染のCell-0の比率
	pc0 <- sum(table0[which(table0[,2]==0&table0[,3]>0),5])/(1-pni0) #RNA2-CFP単独感染のCell-0の比率
	pm0 <- 1-py0-pc0 #混合感染のCell-0の比率

	#単独感染サイトの除外
	table0m <- table0[which(table0[,4]>0),]
	table0m[,5] <- table0m[,5]/sum(table0m[,5]) 

	table1 <- tablei
	for (l in 1:nrow(table0m)){
		table1[,5] <- table1[,5]+table0m[l,5]*dpois(table1[,1],lambda1)*dbinom(table1[,2],table1[,1],table0m[l,2]/table0m[l,1])
	}

	pni1 <- table1[1,5] #感染ウイルスゲノム数0のCell-1の比率
	py1 <- sum(table1[which(table1[,2]>0&table1[,3]==0),5])/(1-pni1) #RNA2-YFP単独感染のCell-1の比率
	pc1 <- sum(table1[which(table1[,2]==0&table1[,3]>0),5])/(1-pni1) #RNA2-CFP単独感染のCell-1の比率
	pm1 <- 1-py1-pc1 #混合感染のCell-1の比率

	#非感染Cell-1の除外
	table1o <- table1[2:ln,]
	table1o[,5] <- table1o[,5]/sum(table1o[,5])

	table2 <- tablei
	for (l in 1:(ln-1)){
		table2[,5] <- table2[,5]+table1o[l,5]*dpois(table2[,1],lambda2)*dbinom(table2[,2],table2[,1],table1o[l,2]/table1o[l,1])
	}

	pni2 <- table2[1,5] #感染ウイルスゲノム数0のCell-2の比率
	py2 <- sum(table2[which(table2[,2]>0&table2[,3]==0),5])/(1-pni2) #RNA2-YFP単独感染のCell-2の比率
	pc2 <- sum(table2[which(table2[,2]==0&table2[,3]>0),5])/(1-pni2) #RNA2-CFP単独感染のCell-2の比率
	pm2 <- 1-py2-pc2 #混合感染のCell-2の比率

	#対数尤度の算出
	logL0 <- dbinom(m0,n0,pm0,log=TRUE)
	logL1 <- dbinom(m1,n1,pm1,log=TRUE)
	logL2 <- dbinom(m2,n2,pm2,log=TRUE)

	LL <- logL0 + logL1 + logL2
	-LL
}

##最尤推定
init <- c(5,5,5) #与える初期値
bottle.opt <- optim(init,bottle, NULL, method="L-BFGS-B", hessian = TRUE, lower=c(0.1,0.1,0.1), upper=c(10,10,10))　#尤度を最大化

bottle.opt$par #最尤推定値を表示

v <- solve(bottle.opt$hessian)　
se <- sqrt(diag(v))
se　#標準誤差を表示
