F分布

# 2つのカイ二乗分布乱数を発生させる
d1 <- 3
d2 <- 5
q1 <- rchisq(1000,d1)
q2 <- rchisq(1000,d2)
# カイ二乗分布乱数を自由度で割ったものの比がF統計量
f <- (q1/d1)/(q2/d2)
# F統計量は構成元の二つの自由度の関数であって、それを用いてp値化する
fp <- pf(f,d1,d2)
# こうして発生させたF統計量のp値が(元が2つの独立なカイ二乗分布なら)一様になっている
plot(sort(fp))

# 乱点数
n <- 100
# 次元
ds <- 1:5
# 試行回数
n.iter <- 1000
Y <- P <- matrix(0,n.iter,length(ds))
for(i in 1:length(ds)){
	for(j in 1:n.iter){
# 乱点座標の発生
		X <- matrix(rnorm(n*ds[i]),ncol=ds[i])
# 乱点間距離の平方和を乱点数-1で割る(不偏分散的な)
		Y[j,i] <- sum(dist(X)^2)/(n-1)
# その値を全乱数を自由度としてカイ二乗分布で評価してp値化
		P[j,i] <- pchisq(Y[j,i],n*ds[i])
	}
}
# 「p値」は次元によらず一様分布
matplot((apply(P,2,sort)),type="l")

  • 異なる次元の正規分布が2つあって、それぞれの正規乱点間距離が作るカイ二乗統計量からF値を出してp値化すると、一様分布化する
n <- 100
ds <- sample(1:20,4)
n.iter <- 10000
Y <- P <- matrix(0,n.iter,length(ds))
for(i in 1:length(ds)){
	for(j in 1:n.iter){
		X <- matrix(rnorm(n*ds[i]),ncol=ds[i])
		Y[j,i] <- sum(dist(X)^2)/(n-1)
		P[j,i] <- pchisq(Y[j,i],n*ds[i])
	}
}

matplot((apply(P,2,sort)),type="l")

F <- Q <- matrix(0,n.iter,length(ds)*(length(ds)-1)/2)
cnt <- 1
for(i in 1:(length(ds)-1)){
	for(j in (i+1):length(ds)){
		F[,cnt] <- (Y[,i]/(n*ds[i]))/(Y[,j]/(n*ds[j]))
		Q[,cnt] <- pf(F[,cnt],n*ds[j],n*ds[i])
		cnt <- cnt+1
	}
}

matplot(apply(Q,2,sort),type="l")