Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Simpsonの公式による数値積分3H24年度 BioS継続勉強会:第9回補助資料1
土居 正明
1 はじめに
1.1 本稿の内容
本稿では、Simpsonの公式を用いた重積分の近似計算方法を考えます。
2 重積分のための準備
「Simpsonの公式による数値積分 1」で見ました、3グリッドごとに 2次関数で近似する式
Si =di
6· φ(z2i−1) +
4di
6· φ(z2i) +
di
6· φ(z2i+1) (1)
をもう少し整備しましょう。具体的には、関数 f(x)の積分に変更し、di = z2i+1 − z2i−1 を代入しまして、
Si =di
6· f(z2i−1) +
4di
6· f(z2i) +
di
6· f(z2i+1)
=z2i+1 − z2i−1
6· f(z2i−1) +
4(z2i+1 − z2i−1)6
· f(z2i) +z2i+1 − z2i−1
6· f(z2i+1)
とします。このカタマリがm個あるとして、i = 1, · · · ,mまで足し合わせてみましょう。
S1 =z3 − z1
6· f(z1) +
4(z3 − z1)6
· f(z2) +z3 − z1
6· f(z3)
S2 =z5 − z3
6· f(z3) +
4(z5 − z3)6
· f(z4) +z5 − z3
6· f(z5)
S3 =z7 − z5
6· f(z5) +
4(z7 − z5)6
· f(z6) +z7 − z5
6· f(z7)
S4 =z9 − z7
6· f(z7) +
4(z9 − z7)6
· f(z8) +z9 − z7
6· f(z9)
S5 =z11 − z9
6· f(z9) +
4(z11 − z9)6
· f(z10) +z11 − z9
6· f(z11)
...
Sm−2 =z2m−3 − z2m−5
6· f(z2m−5) +
4(z2m−3 − z2m−5)6
· f(z2m−4) +z2m−3 − z2m−5
6· f(z2m−3)
Sm−1 =z2m−1 − z2m−3
6· f(z2m−3) +
4(z2m−1 − z2m−2)6
· f(z2m−2) +z2m−1 − z2m−3
6· f(z2m−1)
Sm =z2m+1 − z2m−1
6· f(z2m−1) +
4(z2m+1 − z2m−1)6
· f(z2m) +z2m+1 − z2m−1
6· f(z2m+1)
では、f(zi)の値ごとに整理していきましょう。
1
f(z1)の係数 :z3 − z1
6
f(z2)の係数 :4(z3 − z1)
6
f(z3)の係数 :z3 − z1
6+
z5 − z3
6=
z5 − z1
6
f(z4)の係数 :4(z5 − z3)
6
f(z5)の係数 :z5 − z3
6+
z7 − z5
6=
z7 − z3
6
f(z6)の係数 :4(z7 − z5)
6
f(z7)の係数 :z7 − z5
6+
z9 − z7
6=
z9 − z5
6...
f(z2m−4)の係数 :4(z2m−3 − z2m−1)
6
f(z2m−3)の係数 :z2m−3 − z2m−5
6+
z2m−1 − z2m−3
6=
z2m−1 − z2m−5
6
f(z2m−2)の係数 :4(z2m−1 − z2m+1)
6
f(z2m−1)の係数 :z2m−1 − z2m−3
6+
z2m+1 − z2m−1
6=
z2m+1 − z2m−3
6
f(z2m)の係数 :4(z2m+1 − z2m−1)
6
f(z2m+1)の係数 :z2m+1 − z2m−1
6
まとめます。f(zi)の係数を wi とおくと、
wi =
z3 − z1
6(i = 1)
4(zi+1 − zi−1)6
(i : 偶数)
zi+2 − zi−2
6(i : 1, 2m + 1以外の奇数)
zi − zi−2
6(i = 2m + 1)
となります。この wi をウェイトと呼びます。
このとき、総面積の近似値 S は以下のように表せます。
S =2m+1∑
i=1
Si =2m+1∑
i=1
wi · f(zi)
3 重積分の計算
具体例を用いて計算していきましょう。∫ 1
−1
(∫ 2
−2
Φ(3− x2)φ(x2 − x1)dx2
)φ(x1)dx1 (2)
を計算します。内側の積分の中の、φ(x2−x1)に対して、y = x2−x1 とおきます。x1 を定数とみなして変数変換しますと、∫ 1
−1
(∫ 2−x1
−2−x1
Φ(3− y − x1)φ(y)dy
)φ(x1)dx1 (3)
2
となります。この積分を Simpsonの公式を用いて計算する手順は以下の通りです。
(Step1)変数 x1 に対して、グリッド z1, z2, · · · , z2m+1 をとる*1。
(Step2) (Step1)の各グリッド zi に対して、積分
∫ 2−zi
−2−zi
Φ(3− y − zi)φ(y)dy (4)
を考える。
(Step3)グリッド zi に対して、積分 (4)を計算するための y のグリッド z(i)1 , · · · , z
(i)2mi+1 をとる*2。
(Step4) (Step2)のグリッド zi に対応するウェイト wi、(Step3)のグリッド z(i)j に対応するウェイト w
(i)j をとり、面積 (2)の
近似値 S を
S =2m+1∑
i=1
2mi+1∑
j=1
wi · w(i)j · Φ
(3− z
(i)j − zi
)· φ
(z(i)j
)· φ(zi) (5)
で求める。
では、プログラムを考えていきます。長くなってイメージがつかみにくいですので、本稿の最後に【補足 1】として、作成
されるデータセットのサンプルをご紹介します。プログラムを読んで「難しい」と思った方は、そちらも見ながらプログラ
ムを理解してください。
*no:通し番号, r:x i の数;
*low x1:x1 での積分の下端, upp x1:x1 での積分の上端;
*low x2:x2 での積分の下端, upp x2:x2 での積分の上端;
*f1:標準正規分布の確率密度関数, f2:標準正規分布の累積分布関数;
%macro simp4(no, r);
*【(Step1):変数 x1 に対するグリッドを作成する(d1~d5)】;
*x1 に対するグリッドの作成(最初に −∞ < x1 < ∞の区間に {xi}をとる)*3;
data d1;
do i0 = 1 to&r-1;
x = -3 - 4*log( &r / i0);
output;
end;
do i0 =&r to 5*&r;
x = -3 + 3*(i0 - &r) / (2*&r);
output;
end;
do i0 = 5*&r + 1 to 6*&r -1;
x = 3 + 4*log(&r / (6*&r - i0));
output;
end;
run;
*1 このときのグリッドの取り方は、「Simpsonの公式による数値計算 2」で扱った、「一旦正規分布ベースのグリッド配置をしておいて、区間外の点を落として端っこを追加する」方法にします。以下、y に対するグリッドも同様の方法で考えます。
*2 上付きの添え字 (i)がついているのは、zi ごとにグリッドの取り方が変わるからです。*3 少し分かりにくくて申し訳ないですが、積分変数 x1, x2 と、グリッドを構成する際に考える {xi}は別物と考えていますのでご注意下さい。
3
*{xi}のうち、x1 の積分区間内の点だけ残す(両端は消す);
data d2;
set d1;
if &low x1 < x < &upp x1;
run;
*一番上と一番下に、x1 の積分区間の両端を追加;
data d3;
set d2 end=final;
if N = 1 and final=1 then do; *{xi}が積分区間内に 1つのとき;
x1 = x;
x = &low x1; output; *積分区間の下端を追加;
x = x1; output;
x = &upp x1; output; *積分区間の上端を追加;
end;
else if N =1 then do; *{xi}が積分区間内に 2個以上のとき;
if i0 = 1 then output;
else do;
x1 = x;
x = &low x1; output; *積分区間の下端を追加;
x = x1; output;
end;
end;
else if final=1 then do;
if i0 = 6 * &r - 1 then output;
else do;
output;
x = &upp x1; output; *積分区間の上端を追加;
end;
end;
else output;
keep i0 x;
run;
4
*x1 に対するグリッド {zi}作成(グリッドの変数名は z1);
data d4;
retain retx 0;
set d3;
if N = 1 then do;
z1 = x;
output;
end;
else do;
z1 = (x + retx) / 2; output;
z1 = x; output;
end;
ret x = x;
keep z1; *一旦 i0をなくす;
run;
*グリッドに通し番号を付与する;
data d5;
length i 8.;
set d4;
i = N ; *z の添え字 i を定義する;
run;
*【(Step3):x1 に対するグリッドごとに、x2 に対するグリッドを構成する(d6~d9)】;
*まず、−∞ < x2 < ∞の範囲で {xi}を作成した後、x1 ごとに積分区間を考え、;
*積分区間内のもののみ残す(端点は除く);
data d6;
set d5;
* 2 つ目の積分の積分区間の上限・下限を決める;
low y = &low x2 - z1;
upp y = &upp x2 - z1;
do j0 = 1 to&r-1;
y0 =-3 - 4*log(&r / j0);
if low y < y0 < upp y then output;
end;
do j0 =&r to 5*&r;
y0 = -3 + 3*(j0 -&r) / (2*&r);
if low y < y0 < upp y then output;
end;
do j0 = 5*&r + 1 to 6*&r -1;
y0 = 3 + 4*log(&r / (6*&r - j0));
if low y < y0 < upp y then output;
end;
run;
5
*端点の追加;
data d7;
set d6;
by i;
if first.i = 1 and last.i = 1 then do;
y1 = y0;
y0 = low y; output;
y0 = y1; output;
y0 = uppy; output;
end;
else if first.i = 1 then do;
if j0 = 1 then output;
else do;
y1 = y0;
y0 = low y; output;
y0 = y1; output;
end;
end;
else if last.i = 1 then do;
if j0 = 6*&r - 1 then output;
else do;
output;
y0 = uppy; output;
end;
end;
else output;
keep i z1 y0;
run;
*x2 に対するグリッド {z(i)j }の作成(グリッドの変数名は z2);
data d8;
retain rety0 0;
set d7;
by i;
if first.i = 1 then do;
z2 = y0; output;
end;
else do;
z2 = (y0 + rety0) / 2; output;
z2 = y0; output;
end;
ret y0 = y0;
keep i z1 z2;
run;
6
*番号付与;
data d9;
length i 8.;
retain j 0;
set d8;
by i;
if first.i = 1 then j = 1;
else j = j+1;
run;
**********************************************;
* 以下、ウェイトの計算 ;
**********************************************;
*ウェイト w1の計算;
* → f(z i) の係数の算出には、;
* z i-2, z i-1, z i, z i+1, z i+2が必要;
*【変数 x1 に対するウェイトの計算 (w1p1~w1)】;
*x1 のグリッドの一番上(最小値)を除く;
data w1p1;
set d4;
if N = 1 then delete;
rename z1 = z1p1;
run;
*x1 のグリッドの上から 2つを除く (w1p1の一番上を除く);
data w1p2;
set w1p1;
if N = 1 then delete;
rename z1p1 = z1p2;
run;
*x1 のグリッドの一番下を除いて、一番上を欠測にする;
data w1m1;
set d4 end=final;
if N = 1 then do;
z1m1=. ; output;
z1m1=z1; output;
end;
else if final̂= 1 then do;
z1m1 = z1; output;
end;
keep z1m1;
run;
7
*下から 2番目も除いて、上 2つを欠測にする;
data w1m2;
set w1m1 end=final;
if N = 1 then do;
z1m2 = . ; output;
z1m2 = z1m1; output;
end;
else if final̂= 1 then do;
z1m2 = z1m1;
output;
end;
keep z1m2;
run;
*x1 に対するウェイトの構成(重み変数:w1);
data w1;
merge d4 w1p1 w1p2 w1m1 w1m2 end=final;
i = N ;
if i = 1 then w1 = (z1p2 - z1) / 6;
else if final then w1 = (z1 - z1m2) / 6;
else if mod(i, 2) = 0 then w1 = 4*(z1p1 - z1m1) / 6;
else if mod(i, 2) = 1 then w1 = (z1p2 - z1m2) / 6;
keep i w1;
run;
* 【変数 x2 に対するウェイト w2の計算 (w20~w2)】;
*x1, x2 の両方のグリッドの入ったデータセットから、x2 のグリッドのみ取り出す;
data w20;
set d9;
keep i j z2;
run;
*x2 のグリッドのうち、x1 ごとに一番上を除く;
data w2p1;
set w20;
by i;
if first.i = 1 then delete;
j = j-1;
rename z2 = z2p1;
run;
8
*x1 ごとに 2番目も除く;
data w2p2;
set w2p1;
by i;
if first.i = 1 then delete;
j = j-1;
rename z2p1 = z2p2;
run;
*x1 ごとに一番上を欠測にする;
data w2m1;
set w20;
by i;
if first.i = 1 then do;
j = 1; z2m1 = .; output;
j = 2; z2m1 = z2; output;
end;
else if last.i = 1 then delete;
else do;
j = j+1; z2m1 = z2; output;
end;
keep i j z2m1;
run;
*x1 ごとに上から 2番目を欠測にする;
data w2m2;
set w2m1;
by i;
if first.i = 1 then do;
j = 1; z2m2 = .; output;
j = 2; z2m2 = z2m1; output;
end;
else if last.i = 1 then delete;
else do;
j = j+1; z2m2 = z2m1; output;
end;
keep i j z2m2;
run;
9
*x2 に対するウェイトの構成(重み変数:w2);
data w2;
merge w20 w2p1 w2p2 w2m1 w2m2;
by i j;
if first.i = 1 then w2 = (z2p2 - z2) / 6;
else if last.i = 1 then w2 = (z2 - z2m2) / 6;
else if mod(j, 2) = 0 then w2 = 4*(z2p1 - z2m1) / 6 ;
else if mod(j, 2) = 1 then w2 = (z2p2 - z2m2) / 6;
keep i j w2;
run;
*【x1, x2 のウェイトデータを merge】;
*ウェイトデータセット完成;
data w;
merge w1 w2;
by i;
run;
****************************************;
* Simpsonの公式 (5)の計算;
****************************************;
data d10;
merge d9 w; *グリッドとウェイトをmerge;
by i j;
Si = w1 * w2 * %f2(3-z1-z2) *%f1(z1) * %f1(z2) ;
*Si は Simspsonの公式の 2次関数で近似した面積のうちの 1つではなくて、1グリッド分;
area + Si; *area:Siの累積和;
run;
*結果の出力;
data out&no;
length no r 8.;
set d10 end=final;
no =&no;
r = &r;
if final;
keep no r area;
run;
%mend simp4;
以下、マクロ変数の指定をしていきます。r の値を 1 ∼ 10の 10通り考え、近似精度がどの程度よくなっていくかをみてい
きます*4。
*4 r は、「Simpsonの公式による数値積分 1」や「Simpsonの公式による数値積分 2」でご説明した、グリッドの準備で作る {xi}の数です。
10
実行プログラムは以下の通りです。
*x1 の積分区間の上限・下限;
%let low x1 = -1;
%let uppx1 = 1;
*x2 の積分区間の上限・下限;
%let low x2 = -2;
%let uppx2 = 2;
%macro f1(x); *標準正規分布の確率密度関数;
pdf(’norm’, &x)
%mend f1;
%macro f2(x); *標準正規分布の累積分布関数;
cdf(’norm’, &x)
%mend f2;
%simp4(1, 1)
%simp4(2, 2)
%simp4(3, 3)
%simp4(4, 4)
%simp4(5, 5)
%simp4(6, 10)
%simp4(7, 15)
%simp4(8, 20)
%simp4(9, 50)
%simp4(10, 100)
data out;
set out1 out 2 out 3 out 4 out 5 out 6 out 7 out 8 out 9 out 10;
run;
出力は以下の通りです。
11
no r area
1 1 0.62173
2 2 0.62137
3 3 0.62122
4 4 0.62120
5 5 0.62119
6 10 0.62119
7 15 0.62119
8 20 0.62119
9 50 0.62119
10 100 0.62119
以上より、r = 5以上で小数第 5位まで一致し
∫ 1
−1
(∫ 2
−2
Φ(3− x2)φ(x2 − x1)dx2
)φ(x1)dx1 ; 0.62119
となることが分かりました。
12
【補足 1】作成データセットのサンプル (r = 3)
プログラムを見るだけでは分かりにくいと思いますので、作成されるデータセットのサンプルをご紹介します。r = 3と
します。まず、d1∼d5は変数 x1に対するグリッドの作成です。
d1
OBS i0 x
1 1 -7.39445
2 2 -4.62186
3 3 -3.00000
4 4 -2.50000
5 5 -2.00000
6 6 -1.50000
7 7 -1.00000
8 8 -0.50000
9 9 0.00000
10 10 0.50000
11 11 1.00000
12 12 1.50000
13 13 2.00000
14 14 2.50000
15 15 3.00000
16 16 4.62186
17 17 7.39445
d2
OBS i0 x
1 8 -0.5
2 9 0.0
3 10 0.5
d3
OBS i0 x
1 8 -1.0
2 8 -0.5
3 9 0.0
4 10 0.5
5 10 1.0
d4
OBS z1
1 -1.00
2 -0.75
3 -0.50
4 -0.25
5 0.00
6 0.25
7 0.50
8 0.75
9 1.00
d5
OBS i z1
1 1 -1.00
2 2 -0.75
3 3 -0.50
4 4 -0.25
5 5 0.00
6 6 0.25
7 7 0.50
8 8 0.75
9 9 1.00
13
以下、データが多くなるものは上から 30行目だけ取り出します。d6, d7は変数 x2 に対するグリッド作成の準備です。
d6
OBS i z1 low y upp y j0 y0
1 1 -1.00 -1.00 3.00 8 -0.5
2 1 -1.00 -1.00 3.00 9 0.0
3 1 -1.00 -1.00 3.00 10 0.5
4 1 -1.00 -1.00 3.00 11 1.0
5 1 -1.00 -1.00 3.00 12 1.5
6 1 -1.00 -1.00 3.00 13 2.0
7 1 -1.00 -1.00 3.00 14 2.5
8 2 -0.75 -1.25 2.75 7 -1.0
9 2 -0.75 -1.25 2.75 8 -0.5
10 2 -0.75 -1.25 2.75 9 0.0
11 2 -0.75 -1.25 2.75 10 0.5
12 2 -0.75 -1.25 2.75 11 1.0
13 2 -0.75 -1.25 2.75 12 1.5
14 2 -0.75 -1.25 2.75 13 2.0
15 2 -0.75 -1.25 2.75 14 2.5
16 3 -0.50 -1.50 2.50 7 -1.0
17 3 -0.50 -1.50 2.50 8 -0.5
18 3 -0.50 -1.50 2.50 9 0.0
19 3 -0.50 -1.50 2.50 10 0.5
20 3 -0.50 -1.50 2.50 11 1.0
21 3 -0.50 -1.50 2.50 12 1.5
22 3 -0.50 -1.50 2.50 13 2.0
23 4 -0.25 -1.75 2.25 6 -1.5
24 4 -0.25 -1.75 2.25 7 -1.0
25 4 -0.25 -1.75 2.25 8 -0.5
26 4 -0.25 -1.75 2.25 9 0.0
27 4 -0.25 -1.75 2.25 10 0.5
28 4 -0.25 -1.75 2.25 11 1.0
29 4 -0.25 -1.75 2.25 12 1.5
30 4 -0.25 -1.75 2.25 13 2.0
d7
OBS i z1 y0
1 1 -1.00 -1.00
2 1 -1.00 -0.50
3 1 -1.00 0.00
4 1 -1.00 0.50
5 1 -1.00 1.00
6 1 -1.00 1.50
7 1 -1.00 2.00
8 1 -1.00 2.50
9 1 -1.00 3.00
10 2 -0.75 -1.25
11 2 -0.75 -1.00
12 2 -0.75 -0.50
13 2 -0.75 0.00
14 2 -0.75 0.50
15 2 -0.75 1.00
16 2 -0.75 1.50
17 2 -0.75 2.00
18 2 -0.75 2.50
19 2 -0.75 2.75
20 3 -0.50 -1.50
21 3 -0.50 -1.00
22 3 -0.50 -0.50
23 3 -0.50 0.00
24 3 -0.50 0.50
25 3 -0.50 1.00
26 3 -0.50 1.50
27 3 -0.50 2.00
28 3 -0.50 2.50
29 4 -0.25 -1.75
30 4 -0.25 -1.50
14
変数 x1, x2 の両方に対するグリッドを作成します。
d8
OBS i z1 z2
1 1 -1.00 -1.000
2 1 -1.00 -0.750
3 1 -1.00 -0.500
4 1 -1.00 -0.250
5 1 -1.00 0.000
6 1 -1.00 0.250
7 1 -1.00 0.500
8 1 -1.00 0.750
9 1 -1.00 1.000
10 1 -1.00 1.250
11 1 -1.00 1.500
12 1 -1.00 1.750
13 1 -1.00 2.000
14 1 -1.00 2.250
15 1 -1.00 2.500
16 1 -1.00 2.750
17 1 -1.00 3.000
18 2 -0.75 -1.250
19 2 -0.75 -1.125
20 2 -0.75 -1.000
21 2 -0.75 -0.750
22 2 -0.75 -0.500
23 2 -0.75 -0.250
24 2 -0.75 0.000
25 2 -0.75 0.250
26 2 -0.75 0.500
27 2 -0.75 0.750
28 2 -0.75 1.000
29 2 -0.75 1.250
30 2 -0.75 1.500
d9
OBS i j z1 z2
1 1 1 -1.00 -1.000
2 1 2 -1.00 -0.750
3 1 3 -1.00 -0.500
4 1 4 -1.00 -0.250
5 1 5 -1.00 0.000
6 1 6 -1.00 0.250
7 1 7 -1.00 0.500
8 1 8 -1.00 0.750
9 1 9 -1.00 1.000
10 1 10 -1.00 1.250
11 1 11 -1.00 1.500
12 1 12 -1.00 1.750
13 1 13 -1.00 2.000
14 1 14 -1.00 2.250
15 1 15 -1.00 2.500
16 1 16 -1.00 2.750
17 1 17 -1.00 3.000
18 2 1 -0.75 -1.250
19 2 2 -0.75 -1.125
20 2 3 -0.75 -1.000
21 2 4 -0.75 -0.750
22 2 5 -0.75 -0.500
23 2 6 -0.75 -0.250
24 2 7 -0.75 0.000
25 2 8 -0.75 0.250
26 2 9 -0.75 0.500
27 2 10 -0.75 0.750
28 2 11 -0.75 1.000
29 2 12 -0.75 1.250
30 2 13 -0.75 1.500
15
次に、ウェイトを作成していきます。まずは変数 x1 に対するウェイトです。
w1p1
OBS z1p1
1 -0.75
2 -0.50
3 -0.25
4 0.00
5 0.25
6 0.50
7 0.75
8 1.00
w1p2
OBS z1p2
1 -0.50
2 -0.25
3 0.00
4 0.25
5 0.50
6 0.75
7 1.00
w1m1
OBS z1m1
1 .
2 -1.00
3 -0.75
4 -0.50
5 -0.25
6 0.00
7 0.25
8 0.50
9 0.75
w1m2
OBS z1m2
1 .
2 .
3 -1.00
4 -0.75
5 -0.50
6 -0.25
7 0.00
8 0.25
9 0.50
w1
OBS i w1
1 1 0.08333
2 2 0.33333
3 3 0.16667
4 4 0.33333
5 5 0.16667
6 6 0.33333
7 7 0.16667
8 8 0.33333
9 9 0.08333
16
次に、変数 x2 に対するウェイト作成の準備です。
w20
OBS i j z2
1 1 1 -1.000
2 1 2 -0.750
3 1 3 -0.500
4 1 4 -0.250
5 1 5 0.000
6 1 6 0.250
7 1 7 0.500
8 1 8 0.750
9 1 9 1.000
10 1 10 1.250
11 1 11 1.500
12 1 12 1.750
13 1 13 2.000
14 1 14 2.250
15 1 15 2.500
16 1 16 2.750
17 1 17 3.000
18 2 1 -1.250
19 2 2 -1.125
20 2 3 -1.000
21 2 4 -0.750
22 2 5 -0.500
23 2 6 -0.250
24 2 7 0.000
25 2 8 0.250
26 2 9 0.500
27 2 10 0.750
28 2 11 1.000
29 2 12 1.250
30 2 13 1.500
w2p1
OBS i j z2p1
1 1 1 -0.750
2 1 2 -0.500
3 1 3 -0.250
4 1 4 0.000
5 1 5 0.250
6 1 6 0.500
7 1 7 0.750
8 1 8 1.000
9 1 9 1.250
10 1 10 1.500
11 1 11 1.750
12 1 12 2.000
13 1 13 2.250
14 1 14 2.500
15 1 15 2.750
16 1 16 3.000
17 2 1 -1.125
18 2 2 -1.000
19 2 3 -0.750
20 2 4 -0.500
21 2 5 -0.250
22 2 6 0.000
23 2 7 0.250
24 2 8 0.500
25 2 9 0.750
26 2 10 1.000
27 2 11 1.250
28 2 12 1.500
29 2 13 1.750
30 2 14 2.000
w2p2
OBS i j z2p2
1 1 1 -0.50
2 1 2 -0.25
3 1 3 0.00
4 1 4 0.25
5 1 5 0.50
6 1 6 0.75
7 1 7 1.00
8 1 8 1.25
9 1 9 1.50
10 1 10 1.75
11 1 11 2.00
12 1 12 2.25
13 1 13 2.50
14 1 14 2.75
15 1 15 3.00
16 2 1 -1.00
17 2 2 -0.75
18 2 3 -0.50
19 2 4 -0.25
20 2 5 0.00
21 2 6 0.25
22 2 7 0.50
23 2 8 0.75
24 2 9 1.00
25 2 10 1.25
26 2 11 1.50
27 2 12 1.75
28 2 13 2.00
29 2 14 2.25
30 2 15 2.50
17
変数 x2 に対するウェイトを作成します。
w2m1
OBS i j z2m1
1 1 1 .
2 1 2 -1.000
3 1 3 -0.750
4 1 4 -0.500
5 1 5 -0.250
6 1 6 0.000
7 1 7 0.250
8 1 8 0.500
9 1 9 0.750
10 1 10 1.000
11 1 11 1.250
12 1 12 1.500
13 1 13 1.750
14 1 14 2.000
15 1 15 2.250
16 1 16 2.500
17 1 17 2.750
18 2 1 .
19 2 2 -1.250
20 2 3 -1.125
21 2 4 -1.000
22 2 5 -0.750
23 2 6 -0.500
24 2 7 -0.250
25 2 8 0.000
26 2 9 0.250
27 2 10 0.500
28 2 11 0.750
29 2 12 1.000
30 2 13 1.250
w2m2
OBS i j z2m2
1 1 1 .
2 1 2 .
3 1 3 -1.000
4 1 4 -0.750
5 1 5 -0.500
6 1 6 -0.250
7 1 7 0.000
8 1 8 0.250
9 1 9 0.500
10 1 10 0.750
11 1 11 1.000
12 1 12 1.250
13 1 13 1.500
14 1 14 1.750
15 1 15 2.000
16 1 16 2.250
17 1 17 2.500
18 2 1 .
19 2 2 .
20 2 3 -1.250
21 2 4 -1.125
22 2 5 -1.000
23 2 6 -0.750
24 2 7 -0.500
25 2 8 -0.250
26 2 9 0.000
27 2 10 0.250
28 2 11 0.500
29 2 12 0.750
30 2 13 1.000
w2
OBS i j w2
1 1 1 0.08333
2 1 2 0.33333
3 1 3 0.16667
4 1 4 0.33333
5 1 5 0.16667
6 1 6 0.33333
7 1 7 0.16667
8 1 8 0.33333
9 1 9 0.16667
10 1 10 0.33333
11 1 11 0.16667
12 1 12 0.33333
13 1 13 0.16667
14 1 14 0.33333
15 1 15 0.16667
16 1 16 0.33333
17 1 17 0.08333
18 2 1 0.04167
19 2 2 0.16667
20 2 3 0.12500
21 2 4 0.33333
22 2 5 0.16667
23 2 6 0.33333
24 2 7 0.16667
25 2 8 0.33333
26 2 9 0.16667
27 2 10 0.33333
28 2 11 0.16667
29 2 12 0.33333
30 2 13 0.16667
18
変数 x1, x2 全体のウェイトです。
w
OBS i w1 j w2
1 1 0.08333 1 0.08333
2 1 0.08333 2 0.33333
3 1 0.08333 3 0.16667
4 1 0.08333 4 0.33333
5 1 0.08333 5 0.16667
6 1 0.08333 6 0.33333
7 1 0.08333 7 0.16667
8 1 0.08333 8 0.33333
9 1 0.08333 9 0.16667
10 1 0.08333 10 0.33333
11 1 0.08333 11 0.16667
12 1 0.08333 12 0.33333
13 1 0.08333 13 0.16667
14 1 0.08333 14 0.33333
15 1 0.08333 15 0.16667
16 1 0.08333 16 0.33333
17 1 0.08333 17 0.08333
18 2 0.33333 1 0.04167
19 2 0.33333 2 0.16667
20 2 0.33333 3 0.12500
21 2 0.33333 4 0.33333
22 2 0.33333 5 0.16667
23 2 0.33333 6 0.33333
24 2 0.33333 7 0.16667
25 2 0.33333 8 0.33333
26 2 0.33333 9 0.16667
27 2 0.33333 10 0.33333
28 2 0.33333 11 0.16667
29 2 0.33333 12 0.33333
30 2 0.33333 13 0.16667
19
グリッドとウェイトをmergeし、Simpsonの公式を用いて面積計算をします。
d10
OBS i j z1 z2 w1 w2 Si area
1 1 1 -1.00 -1.000 0.08333 0.08333 0.000407 0.00041
2 1 2 -1.00 -0.750 0.08333 0.33333 0.002024 0.00243
3 1 3 -1.00 -0.500 0.08333 0.16667 0.001183 0.00361
4 1 4 -1.00 -0.250 0.08333 0.33333 0.002599 0.00621
5 1 5 -1.00 0.000 0.08333 0.16667 0.001341 0.00755
6 1 6 -1.00 0.250 0.08333 0.33333 0.002599 0.01015
7 1 7 -1.00 0.500 0.08333 0.16667 0.001183 0.01134
8 1 8 -1.00 0.750 0.08333 0.33333 0.002023 0.01336
9 1 9 -1.00 1.000 0.08333 0.16667 0.000812 0.01417
10 1 10 -1.00 1.250 0.08333 0.33333 0.001224 0.01539
11 1 11 -1.00 1.500 0.08333 0.16667 0.000433 0.01583
12 1 12 -1.00 1.750 0.08333 0.33333 0.000573 0.01640
13 1 13 -1.00 2.000 0.08333 0.16667 0.000177 0.01658
14 1 14 -1.00 2.250 0.08333 0.33333 0.000205 0.01678
15 1 15 -1.00 2.500 0.08333 0.16667 0.000055 0.01684
16 1 16 -1.00 2.750 0.08333 0.33333 0.000055 0.01689
17 1 17 -1.00 3.000 0.08333 0.08333 0.000006 0.01690
18 2 1 -0.75 -1.250 0.33333 0.04167 0.000764 0.01766
19 2 2 -0.75 -1.125 0.33333 0.16667 0.003545 0.02121
20 2 3 -0.75 -1.000 0.33333 0.12500 0.003036 0.02424
21 2 4 -0.75 -0.750 0.33333 0.33333 0.010076 0.03432
22 2 5 -0.75 -0.500 0.33333 0.16667 0.005890 0.04021
23 2 6 -0.75 -0.250 0.33333 0.33333 0.012937 0.05315
24 2 7 -0.75 0.000 0.33333 0.16667 0.006674 0.05982
25 2 8 -0.75 0.250 0.33333 0.33333 0.012935 0.07275
26 2 9 -0.75 0.500 0.33333 0.16667 0.005887 0.07864
27 2 10 -0.75 0.750 0.33333 0.33333 0.010062 0.08870
28 2 11 -0.75 1.000 0.33333 0.16667 0.004036 0.09274
29 2 12 -0.75 1.250 0.33333 0.33333 0.006073 0.09881
30 2 13 -0.75 1.500 0.33333 0.16667 0.002140 0.10095
20
積分の近似値の出力です。
out 3
OBS no r area
1 3 3 0.62122
4 【補足 2】Rでの検算
計算しっぱなしは気持ち悪いので、Rで検算した結果をご紹介します。パッケージ cubatureの関数 adaptIntegrateを用い
ることで重積分が計算できますので、プログラムは以下の通り非常に簡単です。
library(cubature)
f1 < − function(x){ pnorm(3 - x[2]) * dnorm(x[2] - x[1]) * dnorm(x[1])
}adaptIntegrate(f1, c(-1, -2), c(1, 2))
出力は以下の通りです。
$integral
[1] 0.6211886
$error
[1] 5.35479e-06
$functionEvaluations
[1] 1071
$returnCode
[1] 0
となり、Simpsonの公式で計算した値と小数第 6位四捨五入で一致しました。
参考文献
[1] Jennison,C., and Turnbull,B,W. (1999)Group Sequential Methods with application to Clinical Trials. Chapman Hall/CRC.
[2] 森川敏彦,山中竹春(2012)臨床試験における群逐次法 理論と応用,株式会社シーエーシー.([1] の和訳です)
21