この数日の半減期の変化を推定

仙台市放射線物質の半減期の推定です。

この数日で「半減期が延びているのでは?」というツイートをいくつか見かけました。

そこで対数変換上での傾きが変わるモデルに変更し、推定し直しました。

  • 11日からの経過日数が3日以下   :-5
  • 11日からの経過日数が13日以下  :-5 + a1 + b1*(t - 3)
  • 11日からの経過日数が17日以下  :-5 + a1 + a2 + b1*(t - 3)
  • 11日からの経過日数が17日より長い:-5 + a1 + a2 + b1*(17 - 3) + b2*(t - 17)

17日以降で半減期が変わったというモデルにしています。

このモデルで3/14~4/1の放射線量を推定すると次のようになります。

f:id:isseing333:20110402154850j:image


前半(3/28日まで)の半減期は約5日で後半(3/29以降)の半減期は約9日です。

ツイッターでも言われているように、I133の影響が薄れて来ているのかもしれません。


次にこの差が統計的に差があると言えるのか、Bootstrap法を使って検定します。

2,000回推定すると、(半減期2 - 半減期1)の分布は次のようになります。

2.5%50%97.5%片側P値
-6.11日3.55日8.26日0.052


半減期1より半減期2の方が平均的に3.55日長く、片側P値は0.052です。

半減期1より半減期2の方が長い」という条件で検定するのであれば片側で十分ですので、有意といっても良いレベルだと思います。


統計学的な見地からも、現在のデータではここ数日は半減期が長くなっていると言ってもいいのかもしれません。



options(encoding="SJIS")
HoushaSen <- read.csv("放射線.csv", as.is = T)

plot(HoushaSen[, 3], HoushaSen[, 2], lwd = 2)
plot(HoushaSen[, 3], log10(HoushaSen[, 2]), lwd = 2)


#---ベースラインの補正
HoushaSenBase      <- HoushaSen
HoushaSenBase[, 2] <- HoushaSenBase[, 2] - 0.04





OptimHangenki <- function(Tvec, Hvec){
	T <- Tvec
	H <- Hvec

	Hangenki <- function(Beta){
		T1 <- 3
		T2 <- 13
		T3 <- 17
		a1 <- Beta[1]
		a2 <- Beta[2]
		b1 <- Beta[3]
		b2 <- Beta[4]
		t  <- T
		Pred  <- ifelse(t  <= T1, -5, 
			 ifelse(t  <= T2, -5 + a1 + b1*(t - T1),
			 ifelse(t  <= T3, -5 + a1 + a2 + b1*(t - T1), 
			 ifelse(T3 <  t , -5 + a1 + a2 + b1*(T3 - T1) + b2*(t - T3), NA))))
		Resid <- log10(H) - Pred
		Resid%*%Resid
	}
	optim(c(0, 0, 0, 0), Hangenki)
}

(PredHangenki <- OptimHangenki(HoushaSenBase[, 3], HoushaSenBase[, 2]))



T1 <- 3
T2 <- 13
T3 <- 17
Beta <- PredHangenki$par
a1 <- Beta[1]
a2 <- Beta[2]
b1 <- Beta[3]
	b2 <- Beta[4]
t     <- HoushaSenBase[, 3]
Pred  <- ifelse(t  <= T1, -5, 
	 ifelse(t  <= T2, -5 + a1 + b1*(t - T1),
	 ifelse(t  <= T3, -5 + a1 + a2 + b1*(t - T1), 
	 ifelse(T3 <  t , -5 + a1 + a2 + b1*(T3 - T1) + b2*(t - T3), NA))))
Resid <- log10(HoushaSenBase[, 2]) - Pred
Resid%*%Resid
(Half1  <- -(log10(20) - log10(10)) / b1)
(Half2  <- -(log10(20) - log10(10)) / b2)


plot(HoushaSenBase[, 3], log10(HoushaSenBase[, 2]), lwd = 2, xlab = "day (+11)", ylab = "log10()", 
	main = "Sendai-shi Aoba-ku (baseline: -0.04μSv)")
lines(t, Pred, lwd = 2)
text(15, -0.6, paste("Estimated Half-period1: ", round(Half1, digits = 2), " day", sep = ""))
text(15, -0.7, paste("Estimated Half-period2: ", round(Half2, digits = 2), " day", sep = ""))




#bootstrap
BootHangenki <- function(nboot, Housha, T1){
	#---make data frame using T and D
	Data  <- data.frame(Housha, T1)
	
	#---produce NULL data
	ResultBoot      <- matrix(NA, nboot, 4)
	
	#---perform bootstrap SSI
	for(i in 1:nboot){
		set.seed(i)
		BootID          <- sample(1:nrow(Data), nrow(Data), replace = "T")
		BootSample      <- Data[BootID, ]
		BootSample      <- BootSample[order(as.numeric(rownames(BootSample))), ]
		
		T <- BootSample[, 2]
		H <- BootSample[, 1]
		PredHangenki    <- OptimHangenki(T, H)
		ResultBoot[i, ] <- PredHangenki$par
		print(i)
	}
	
	a1 <- ResultBoot[, 1]
	a2 <- ResultBoot[, 2]
	b1 <- ResultBoot[, 3]
	b2 <- ResultBoot[, 4]
	hangen1 <- -(log10(20) - log10(10)) / b1
	hangen2 <- -(log10(20) - log10(10)) / b2
	
	print("median, 95% CI of Bootstrap hangenki")
	print(round(quantile(hangen1, probs = c(0.025, 0.5, 0.975), na.rm = T), digits =2))
	print(round(quantile(hangen2, probs = c(0.025, 0.5, 0.975), na.rm = T), digits =2))
	
	ResultBoot
}

Boot <- BootHangenki(2000, HoushaSenBase[, 2], HoushaSenBase[, 3])

Half1 <- -(log10(20) - log10(10)) / Boot[, 3]
Half2 <- -(log10(20) - log10(10)) / Boot[, 4]

HalfDiff <- Half2 - Half1
length(HalfDiff[HalfDiff < 0]) / length(HalfDiff)
quantile(HalfDiff, probs = c(0.025, 0.5, 0.975))

ページTOPへ