統計解析ソフトRを用いて,統計解析の理論と実践を学ぶ
# #以下はコメント文なので,R には読み込まれず,無視される. # # 英語得点データを用いて,データの基本統計量の計算演習を行う. # #英語の得点 eigo <- c( # 36,70,56,68,76,60,50,63,62,42,64,60,50,68,71,67, 50,65,67,57,72,64,61,66,46,80,46,51,59,32,55,65, 65,52,57,64,23,57,53,54,38,71,57,69,77,61,51,64, 63,43,65,61,51,69,72,68,53,66,68,58,73,65,62,67, 47,81,47,52,59,33,56,66,67,52,58,65,24,58,54,55) length(eigo) #データ数 mean(eigo) #標本平均 var(eigo) #標本分散 sd(eigo) #標本標準偏差 boxplot(eigo, main="英語得点の箱ヒゲ図") #箱ひげ図 boxplot.stats(eigo) #箱ひげ図用統計量 summary(eigo) #英語得点データの要約 hist(eigo, breaks=seq(0, 100, by=5), xlab="English score", ylab="Frequency", main="") title(main = "英語得点のヒストグラム") #グラフタイトル stem(eigo, scale=2) #幹葉表示 # # 散布図と回帰直線 # x <- 1:10 #連続した自然数 y <- c(3,5,6,6,9,10,6,9,10,7) plot(x, y) # データの散布図 reg <- lm(y ~ x) # 回帰の計算 summary(reg) # 回帰の結果表示 reg$coefficients # 回帰係数 abline(reg, col="red") # 回帰直線の表示 cor(x, y) # 相関係数 |
![]() 回帰直線:y = 4.2 + 0.527x |
となる.
   5,6の個数    |    0 |    1 |    2 |    3 |    4 |    5 |    6 |
---|---|---|---|---|---|---|---|
出た回数 |    185    |    1149    |    3265    |    5475    |    6114    |    5194    |    3067    |
   5,6の個数    |    7 |    8 |    9 |    10 |    11 |    12 |    合計 |
出た回数 |    1331    |    403    |    105    |    18    |    0    |    0    | 26306    |
1つのサイコロが5か6の目を出す確率を p とすると,12個のサイコロを同時に振って,5 か 6 の目
が出る個数は 2 項分布 Binom(12, p) に従うはずである.
2 項分布 Binom(12, p) の平均は 12p,分散は 12p(1-p) であるので,
p のデータからの
推定値
は,データの平均値を用いて,
平均= 12*1/3 = 4,分散= 12*1/3*(1-1/3) = 4*2/3 = 2.667
となるはずである.データの統計量とは異なる度合いが大きいので,サイコロは完全に正しく なく,大きな目(5 か 6 の目)の出る確率の方がほんの少し高いと言える.
   モデル    |    平均    |    分散    |
---|---|---|
   データ    |    4.052    |    2.696    |
   2項分布(p=0.338)    |    4.052    |    2.685    |
   2項分布(p=0.333)    |    4    |    2.667    |
x <- 0:12 | #個数 |
dice <- c(185,1149,3265,5475,6114,5194,3067,1331,403,105,18,0,0) | #回数データ |
sum(dice) | #試行回数 |
pdice <- dice/sum(dice) | #回数の確率 |
m <- sum(x*pdice); m | #平均 |
p <- m/12 | #5,6の出る確率 |
s2 <- sum(pdice*(x-m)^2); s2 | #分散 |
v <- 12*p*(1-p) | #二項分布のもとでの分散 |
h1 <- dbinom(x, 12, 1/3) | #正しいサイコロのもとでの二項確率分布 |
h2 <- dbinom(x, 12, p) | #推定確率からの二項確率分布 |
dicedis <- rbind(pdice,h2,h1) | #行ベクトル->行列 |
colnames(dicedis) <- as.character(0:12) | #列の名前 |
barplot(dicedis, beside=TRUE, cex.axis=0.8, cex.lab=1.0, xlab="Number of 5,6", ylab="Probability", legend=c("data","p=0.338", "p=0.333")) | |
title(main="Distribution of the experiment of dices by Weldon") | #グラフタイトル |
   女児数    |    0 |    1 |    2 |    3 |    4 |    5 |    6 |
---|---|---|---|---|---|---|---|
度数 |    7    |    45    |    181    |    478    |    829    |    1112    |    1343    |
   女児数    |    7 |    8 |    9 |    10 |    11 |    12 |    合計 |
度数 |    1033    |    670    |    286    |    104    |    24    |    3    | 6115    |
平均:,分散:
x <- 0:20 | # 抽出された白石の個数 |
m <- 50 | # 白石の個数 |
n <- 450 | # 黒石の個数 |
k <- 50 | # 抽出回数 |
y <- dhyper(x, m, n, k) | # 超幾何分布確率分布 |
plot(x,y,type="h") | # |
p <- m/(m+n) | # 白石が選ばれる確率 |
yd <- dbinom(x, k, p) | # 二項確率 |
x1 <- x+0.1 | # 0.1 ずらして表示 |
points(x1, yd, type="h", col="red") | # 二項確率のグラフ |
title(main="Hypergeometric and binomial distribution") | # |
legend(locator(1),c("Hypergeometric","Binomial"), lty=1, col=c("black", "red")) | |
# グラフの適当なところをクリックすると,凡例がそこに表示される(locator(1)). |
m <- 50 | # 標識をつけた数 |
n <- 450 | # 標識をつけられていない数 |
k <- 50 | # 再捕獲数 |
estimate <- NULL | # 個体数推定値の定義 |
for (i in 1:10000) { | # 10000回のシミュレーション |
x <- rhyper(1, m, n, k) | # 超幾何分布に従う乱数1つ抽出 |
estimate <- c(estimate, k * m / x) | # 個体数推定値列ベクトル |
} | # |
hist(estimate, breaks=seq(0, 2600, by=100), main="") | #推定値のヒストグラム |
title(main="Distribution of habitat estimates ") | #タイトル |
table(estimate) | #推定値の階級分け |
quantile(estimate, c(0.05, 0.1, 0.5, 0.9, 0.95)) | # 分位点(パーセンタイル) |
問題2:上の例では捕獲(m = 50),再捕獲(k = 50)合わせて100頭を捕獲している.捕獲総数100頭
を固定して,捕獲頭数と再捕獲頭数を変えたときの推定精度はどうなるか.
また,予算の関係で捕獲総数を半分の50頭にした場合の推定精度はどうなるか.
注)推定精度は,推定値の平均 mv や標準偏差(標準誤差)sd を求め,そこから正規近似により,未知 母数 θ の 95 %信頼区間として,
ヒント:推定精度に必要な項目として,推定値の発散割合(table(estimate)), メディアン(中央値),90%もしくは95%信頼区間(quantile(estimate, c(0.05, 0.1, 0.5, 0.9, 0.95)) を比較する.
となり,n の極限でこの二項分布は平均 λ のポアソン分布に従うことがわかる.
   死亡記事件数    |    0 |    1 |    2 |    3 |    4 |    5 |    6 以上 |
---|---|---|---|---|---|---|---|
日数 |    484    |    391    |    164    |    45    |    11    |    1    | 0    |
死亡記事件数データの平均は0.8239,分散は0.8294,であった.このデータがポアソン分布に従っている
と考える.ポアソン分布の平均は λ なので,λ = 0.8239 のポアソン分布にあてはめてみたところ,非常によく
一致していた.
また,ポアソン分布は,平均と分散が等しいという特徴がある.データの平均と分散の値が
近いことから,データはポアソン分布によく適合していることを示している.
![]() |
|
x <- 0:6 | #グラフのx軸の範囲 |
y <- c(484, 391, 164, 45, 11, 1, 0) | #死亡記事件数データ |
s <- sum(y) | #データ総数 |
m <- sum(x*y/s) | #データ分布の平均 |
v <- sum((x-m)^2*y/s) | #データ分布の分散 |
yp <- dpois(x, m) | #平均 m のポアソン分布確率密度 |
plot(x, y/s, type="h", ylab="確率") | #データの棒グラフ表示 |
points(x, yp, type="b", col="red") | #ポアソン分布の重ねがき(赤) |
title(main="死亡記事件数へのポアソン分布のあてはめ") | |
legend(3.5, 0.4, c("データ", "ポアソン分布"), lty=1, col=c("black","red")) |
n <- 200 | # 個体数 |
m <- 10 | # メッシュ(m2 個) |
x <- runif(n) | # 一様乱数n個 |
y <- runif(n) | # 一様乱数n個 |
# | # |
count <- NULL | # count の定義 |
for(i in 1:m){ | # m 回の繰り返し |
n1 <- (1:n)[x < (i-1)/m] | # (i-1)/m 以下の乱数である番号 |
n2 <- (1:n)[x < i/m] | # i/m 以下の乱数である番号 |
nin <- n2[!n2 %in% n1] | # (i-1)/m から i/m の番号 |
yy <- y[nin] | # 上記 x 座標に対する y 座標 |
a <- hist(yy, breaks=0:m/m) | # yy を 0 から 1 まで 1/m きざみで区切る |
count <- c(count, a$counts) | # 区切った領域に入った個体の個数のベクトル |
} | # 繰り返しここまで |
mc <- max(count) | # メッシュ内の個数の最大値 |
xp <- 0:mc | # 個数の定義域 |
d <- factor(count, levels=xp) | # 個数が 0 の階級も含める |
table(d) | # メッシュ内個数の区分 |
s <- sum(table(d)) | # 総個数 |
m1 <- sum(xp*table(d)/s) | # カウント分布の平均 |
m2 <- mean(count) | # カウントデータの標本平均 |
v1 <- sum(table(d)/s*(xp-m1)^2) | # カウント分布の分散 |
v2 <- var(count) | # カウントデータの標本分散 |
# | # |
op <- par(mfrow = c(1, 2)) | # 横に2つのグラフを並べる |
plot(x,y, col="red") | # 個体分布の表示 |
abline(h=0, v=0) | # 外枠 |
abline(h=1, v=1) | # 外枠 |
for(i in 1:m) abline(h=i/m, v=i/m, lty=2) | # メッシュ区分線 |
plot(xp, table(d)/s, type="h") | # 区分された分布のグラフ |
lam <- n/(m*m) | # 平均 |
yp <- dpois(xp, lam) | # ポアソン分布確率密度 |
points(xp, yp, type="b", col="red") | # ポアソン分布グラフ表示 |
par(op) | # グラフ表示もとに戻す |
title(main="Distribution of number of individuals in mesh partitions") | # タイトル |
m1 | # カウント分布平均 |
v1 | # カウント分布分散 |
平均,分散はそれぞれ,
n <- 200 | # 個体数(予定) |
m <- 10 | # メッシュ(m2 個) |
p <- 4 | # 平均子ども数 |
sig <- 0.05 | # 正規分布標準偏差 |
xx <- NULL | # xx(子ども座標)の定義 |
xx0 <- NULL | # xx0(親座標)の定義 |
np <- round(n/p) | # 親の数(round() は 5 捨 6 入) |
for(i in 1:np){ | # np 回の繰り返し |
x0 <- runif(2) | # 親個体の座標を一様乱数で生成 |
n0 <- rpois(1, p) | # 子どもの数を平均 p のポアソン乱数で生成 |
for(j in 1:n0){ | # n0 回の繰り返し |
xd <- rnorm(2, m=x0, sd=sig) | # 子どもの座標を,正規乱数 N(x0, sig2)で生成 |
if(xd[1] > 1) xd[1] <- xd[1] - 1 | # x 座標が 1 を超えたとき区画の左端に |
if(xd[1] < 0) xd[1] <- xd[1] + 1 | # x 座標が 0 未満のとき区画の右端に |
if(xd[2] > 1) xd[2] <- xd[2] - 1 | # y 座標が 1 を超えたとき区画の下辺に |
if(xd[2] < 0) xd[2] <- xd[2] + 1 | # y 座標が 0 未満のとき区画の上辺に |
xx <- rbind(xx, xd) | # 個体座標行列の行の追加 |
xx0 <- rbind(xx0, x0) | # 個体座標行列の行の追加 |
} | # |
} | # |
# 区画内個体数 | # |
x <- xx[,1]; y <- xx[,2] | # x 座標ベクトル,y 座標ベクトル |
count <- NULL | # count の定義 |
for(i in 1:m){ | # m 回の繰り返し |
n1 <- (1:n)[x < (i-1)/m] | # (i-1)/m 以下の乱数である番号 |
n2 <- (1:n)[x < i/m] | # i/m 以下の乱数である番号 |
nin <- n2[!n2 %in% n1] | # (i-1)/m から i/m の番号 |
yy <- y[nin] | # 上記 x 座標に対する y 座標 |
a <- hist(yy, breaks=0:m/m) | # yy を 0 から 1 まで 1/m きざみで区切る |
count <- c(count, a$counts) | # 区切った領域に入った個体の個数のベクトル |
} | # |
mc <- max(count) | # メッシュ内の個数の最大値 |
xp <- 0:mc | # 個数の定義域 |
d <- factor(count, levels=xp) | # 個数が 0 の階級も含める |
table(d) | # メッシュ内個数の階級区分 |
s <- sum(table(d)) | # 総個体数 |
m1 <- sum(xp*table(d)/s) | # カウント分布の平均 |
v1 <- sum(table(d)/s*(xp-m1)^2) | # カウント分布の分散 |
# | # |
op <- par(mfrow = c(1, 2)) | # 横に2つのグラフを並べる |
plot(x,y, col="red") | # 個体分布の表示 |
points(xx0, pch="+", col="green") | # 個体分布の表示 |
abline(h=0, v=0) | # 外枠 |
abline(h=1, v=1) | # 外枠 |
for(i in 1:m) abline(h=i/m, v=i/m, lty=3) | # メッシュ区分線 |
plot(xp, table(d)/s, type="h", ylim=c(0,0.35)) | # 区分された分布のグラフ |
yp <- dpois(xp, m1) | # ポアソン分布確率 |
points(xp, yp, type="b", col="red") | # ポアソン分布表示 |
nbp <- m1/v1 | # |
nbn <- m1*nbp/(1-nbp) | # |
ynb <- dnbinom(xp, nbn, nbp) | # 負の二項分布確率 |
points(xp, ynb, type="b", col="green") | # 負の二項分布表示 |
legend(2.5, 0.33, c("data", "poisson", "negativebino"), lty=1, col=c("black","red","green")) | |
par(op) | # 個体数 |
title(main="区画内個数へのポアソン分布と負の二項分布のあてはめ") | |
m1 | # 平均 |
v1 | # 分散 |
課題:平均子ども数である p の値を増やすとどうなるか.
問題3:上のデータをポアソン分布と負の二項分布にあてはめ,どちらの分布のあてはまりがよいか
考察せよ.ただし,'5 以上'は 5 とみなすとする.(正確ではない.)
ヒント:ポアソン分布へのあてはめは,上の死亡記事件数の例と同じである.
負の二項分布へのあてはめは,データの平均と分散が負の二項分布の平均と分散と等しいと考えることにより,
負の二項分布のパラメータの推定ができる.これをモーメント法による分布パラメータの推定という.
発展問題:'5 以上'は 5 とみなさない正確な推定法を考えよ.(できなくてよい)
n <- 10000 | #一様乱数の個数 |
x <- runif(n, -1, 1) | #(-1, 1) の範囲の一様乱数 n 個生成 |
y <- runif(n, -1, 1) | # |
r <- x^2 + y^2 | #原点からの距離の2乗 |
plot(x,y, type="n", xlim=c(-1,1), ylim=c(-1,1)) | #グラフの表示範囲の指定 |
abline(h=0) | # x 軸の表示 |
abline(v=0) | # y 軸の表示 |
segments(-1, 1, 1, 1) | #(-1, 1)から(1, 1)までの直線 |
segments(1, 1, 1, -1) | # |
segments(-1, -1, 1, -1) | # |
segments(-1, -1, -1, 1) | # |
pin <- (1:n)[r<1] | #乱数のうち単位円内に入る乱数の番号 |
points(x[-pin], y[-pin], pch=".", col="green") | #単位円の外の乱数を緑点で表示 |
points(x[pin], y[pin], pch=".", col="red") | #単位円内の乱数を赤い点で表示 |
s <- 0:360 | # 0 度から 360 度 |
theta <- s*pi/180 | #度をラジアンに変換 |
xp = sin(theta) | #単位円の x 座標 |
yp = cos(theta) | #単位円の y 座標 |
points(xp,yp, type="l") | #単位円を表示 |
title(main="(-1,1)一様乱数による点列と単位円") | |
length(pin) | #単位円内に入った乱数の個数 |
4*length(pin)/n | # πの推定値. |
![]() |
|
x <- seq(0,1, by=0.01) | # x の定義 0 から 1 まで 0.01 きざみ |
y <- dbeta(x, 0.5, 0.5) | # a, b = 0.5, 0.5 のβ分布 |
plot(x, y, type="l", ylim=c(0,3), col="red") | # y を 0 から 3 に指定(赤) |
abline(v=0, h=0) | # y 軸と x 軸の表示 |
curve(dbeta(x, 1, 1), 0, 1, add=T) | # a, b = 1, 1 のβ分布 |
curve(dbeta(x, 2, 2), 0, 1, add=T, col="blue") | # a, b = 2, 2 のβ分布(青) |
curve(dbeta(x, 1, 3), 0, 1, add=T, col="green") | # a, b = 1, 3 のβ分布(緑) |
curve(dbeta(x, 2, 4), 0, 1, add=T, col="purple") | # a, b = 2, 4 のβ分布(紫) |
title(main="β分布") | # |
となる.このとき,
とおくと,ベータ分布の平均と分散はそれぞれ,
となる.
ベータ二項分布は x と p の同時分布を p で積分して
周辺化した x の周辺分布(marginal distribution)である.すなわち,
となることが知られている.ベータ分布で θ → 0 とすると,Var[p] → 0 となり,ベータ分布は μ に集中 した分布に退化する.このとき,Var[x] → nμ(1-μ) になり,ベータ二項分布は二項分布 Binom(n, μ) に収束する.
   女児数    |    0 |    1 |    2 |    3 |    4 |    5 |    6 |
---|---|---|---|---|---|---|---|
度数 |    7    |    45    |    181    |    478    |    829    |    1112    |    1343    |
   女児数    |    7 |    8 |    9 |    10 |    11 |    12 |    合計 |
度数 |    1033    |    670    |    286    |    104    |    24    |    3    | 6115    |
このデータの平均,分散はそれぞれ,
であった.単純な二項分布モデルを考えると女児の生まれる確率の推定値
は,
となる.データが二項分布に従っているなら,その平均,分散はそれぞれ,
となるはずである.しかし,データの分散 3.49 はこの想定される分散より大きく,
過分散になっていると考えられる.
問題4:12 人のきょうだい中の女児数のデータにベータ二項分布をあてはめ,単純な二項
分布(p = 0.481)のあてはめと比較せよ.なお,ベータ二項分布のあてはめには,
データの平均・分散と分布の平均・分散とが等しいとおく
モーメント法を用いよ.
また,あてはめたベータ分布から女児出生確率の95%信用区間を求めよ.
ヒント1:ベータ二項分布の密度関数のスクリプトは,
y <- lchoose(n, x) + lbeta(x+a, n-x+b) - lbeta(a,b) h2 <- exp(y)
ヒント2:パラメータ a,b のベータ分布の95%区間のスクリプトは,
qbeta(c(0.025, 0.975), a, b)
![]() |
![]() |
pnorm(-1) | # = 0.16(赤矢印) |
pnorm(1) - pnorm(-1) | # = 0.683 |
pnorm(2) - pnorm(-2) | # = 0.954 |
qnorm(0.975) | # = 1.96(青矢印),両側 5 %点 |
n <- 1000 | # 乱数列の長さ |
x <- rnorm(n) | # 標準正規乱数 |
op <- par(mfrow = c(1, 2)) | # |
hist(x, breaks=seq(-10,10, by=0.2), xlim=c(-5,5),freq=F, main="") | # 乱数のヒストグラム |
curve(dnorm(x), add=T, col=2) | # 標準正規分布の重ね合わせ |
title(main="Histgram of Normal random numbers") | # タイトル |
qqnorm(x, main="") | # 正規 Q - Q プロット |
qqline(x, col=2) | # 正規分布の四分位範囲直線表示 |
title(main="Normal Q - Q plot") | # タイトル |
par(op) | # |
eigo <- c( 36,70,56,68,76,60,50,63,62,42,64,60,50,68,71,67, # 英語得点データ 50,65,67,57,72,64,61,66,46,80,46,51,59,32,55,65, 65,52,57,64,23,57,53,54,38,71,57,69,77,61,51,64, 63,43,65,61,51,69,72,68,53,66,68,58,73,65,62,67, 47,81,47,52,59,33,56,66,67,52,58,65,24,58,54,55) d <- 5 # ヒストグラムの階級幅 n <- length(eigo) # データ数 m <- mean(eigo) # 平均 s <- sd(eigo) # 標準偏差 op <- par(mfrow = c(1, 2)) # グラフを横に2つ並べて表示 #hist(eigo, breaks=seq(0, 100, by=d), xlab="英語得点", ylab="頻度", main="") # 頻度ヒストグラム #curve(n*d*dnorm(x, m, s), 0, 100, add=TRUE, col="red") # 推定正規分布重ねて表示 hist(eigo, breaks=seq(0, 100, by=d), freq=F, xlab="英語得点", ylab="密度", main="") # 密度ヒストグラム curve(dnorm(x, m, s), 0, 100, add=TRUE, col="red") # 推定正規分布重ねて表示 title(main="英語得点のヒストグラム") # qqnorm(eigo, xlab="正規分布分位点", ylab="英語得点分位点", main="") qqline(eigo, col=2) # Q-Q プロット title(main="正規 Q - Q プロット") # par(op) |
![]() |
![]() |
![]() |
N <- 10000 | # 乱数列の長さ |
n <- 2 | # 標本平均のサイズ |
u <- matrix(data=runif(n*N), ncol=n) | # N×n の一様乱数行列 |
um <- apply(u, 1, mean) | # 行ごとの平均 |
op <- par(mfrow = c(1, 2)) | # 標本平均のヒストグラム |
hist(um, breaks=seq(0,1,by=0.02), freq=FALSE, ylim=c(0, 2.5), xlab="", ylab="頻度", main="") | |
m <- mean(um) | # 標本平均列の平均 |
s <- sd(um) | # 標本平均列の標準偏差 |
curve(dnorm(x, m, s), 0, 1, add=TRUE, col="red") | # 正規分布の重ねがき |
qqnorm(um, xlab="Normal quantile", ylab="Data quantile", main="") | # 正規 Q - Q プロット |
qqline(um, col="red") | # 正規分布の四分位範囲直線表示 |
par(op) | # |
title(main="一様乱数 2 個の標本平均分布に正規分布 N(0.5, 0.042) を重ね書き") |
課題:サンプルサイズ n を大きくして,標本平均の分布が正規分布に近づく様子を確かめよ.
dai <- read.csv("daizu.csv"); dai #ダイズ地上部乾物重データ読み込み dim(dai) #データの大きさ表示 head(dai) # データの部分表示 height <- as.vector(as.matrix(dai)) #行列データのベクトル化 boxplot(height) #箱ヒゲ図 boxplot.stats(height) #箱ひげ図用統計量 # m <- mean(height, na.rm=TRUE); m #標本平均 s <- sd(height, na.rm=TRUE); s #標本標準偏差 op <- par(mfrow = c(1, 2)) hist(height, breaks=seq(0,200, by=10), freq=FALSE) curve(dnorm(x, mean=m, sd=s), 0, 200, add=TRUE, col="red") #正規分布 qqnorm(height) #正規 Q - Q プロット qqline(height, col="red") par(op) |
問題5:夏作物では周辺部分は,隣接個体が少ないことから競合が少なく,また受光や風通し
がよくなったりして圃場内部の個体より生育条件が有利になることがある.これを周辺効果という.
周辺効果の影響を避けるため,圃場実験では周囲の1~2畦や4~5株のデータは解析から外すことが多い.
ここで取り上げたデータは,畦1が西側,1行目が北側境界であった.
周辺部分のデータを除き,地上部乾物重データを正規分布にあてはめ,あてはまりの変化を考察せよ.
また,異常に生育の悪い個体が一部ある.たとえば,乾物重が20以下の個体を除いてみると正規分布への
あてはまりはどうなるか.
注)データ行列 dai の一部を取り出すときは,例えば
dai2 <- dai[3:25,3:12] height2 <- as.vector(as.matrix(dai2))
bad <- which(height2 < 20) height3 <- height2[-bad]
N <- 10000 | # 乱数列の長さ |
n <- 2 | # 自由度 |
u <- matrix(rnorm(n*N), ncol=n) | # N×n の標準正規乱数乱数行列 |
u2 <- u^2 | # 行列の要素の2乗 |
un <- apply(u2, 1, sum) | # 行ごとの和 |
umx <- ceiling(max(un)) | # 最大値を超える整数 |
hist(un, breaks=seq(0,umx,by=0.5), freq=FALSE, xlim=c(0,15), xlab="Sum of squares of n normal random numbers", main="") | |
curve(dchisq(x, n), 0, 15, add=T, col=2) | # 自由度 2 の χ2 分布の重ね合わせ |
title(main="Histogram of sum of squares of \n normal random numbers") | # タイトル |
N <- 10000 | # 乱数列の長さ |
m <- 4 | # 分子自由度 |
n <- 10 | # 分母自由度 |
um0 <- matrix(rnorm(m*N), ncol=m) | # N×m の標準正規乱数乱数行列 |
um2 <- um0^2 | # 行列の要素の2乗 |
um <- apply(um2, 1, sum) | # 行ごとの和 |
um <- um/m | # 自由度で割る |
un0 <- matrix(rnorm(n*N), ncol=n) | # |
un2 <- un0^2 | # |
un <- apply(un2, 1, sum) | # |
un <- un/n | # |
fv <- um/un | # χ2 分布乱数の比 |
fmx <- ceiling(max(fv)) | # fv の最大値を超える整数 |
hist(fv, breaks=seq(0,fmx,by=0.2), freq=FALSE, xlim=c(0,6), main="") | |
curve(df(x, m, n), 0, 6, add=T, col=2) | # 自由度 4,10 の F 分布の重ね合わせ |
title(main="Histgram of ratio of \n independent chi-squared random numbers") |
N <- 10000 | # シミュレーション回数 |
n <- 10 | # 1回のサンプルサイズ(自由度) |
un0 <- matrix(rnorm(n*N), ncol=n) | # N×n の標準正規乱数行列 |
un2 <- un0^2 | # 標準正規乱数行列の要素の2乗 |
un <- apply(un2, 1, sum) | # 要素の2乗の各行の和(自由度 n の χ2 分布乱数 N 個) |
unr <- sqrt(un/n) | # 自由度 n の χ2 分布乱数を n で割った平方根 |
z <- rnorm(N) | # 標準正規乱数 N 個 |
tv <- z/unr | # t 値 N 個 |
tmx <- ceiling(max(abs(tv))) | # t 値 の絶対値の最大 |
hist(tv, breaks=seq(-tmx,tmx,by=0.2), freq=FALSE, xlim=c(-5,5), main="") | |
curve(dt(x, n), add=T, col=2) | # 自由度 10 の t 分布の重ねがき |
title(main="Histgram of t - values ") |