質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

解決済

1回答

1848閲覧

パラメトリックブートストラップ法について

suugaku_nyumon

総合スコア37

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

0クリップ

投稿2021/06/14 16:36

疑問点

ある論文を読んでいた際にパラメトリックブートストラップ法という統計手法が出てきており、そのパラメトリックブートストラップ法について独学しているのですが、この手法やコードは以下の考え方で誤りはないでしょうか?

関数等で恐らくブートストラップ法は実装されているとは思われますが、ただし今回は理解しているかに重点を置きたかったので、自分で計算が理解できている関数のみを使っています。ノンパラメトリックブートストラップ法というものもあり、それと混同しているのではないかと不安です。

私はブートストラップ標本から得られた統計量の経験分布を用いて統計量を推定する方法がノンパラメトリックブートストラップ法で、以下のコードのように得られた統計量が何かしらの分布に従っていると仮定して(今回の場合は自由度がブートストラップ標本の作成回数-1のt分布に従っていると仮定)、統計量を推定するのがパラメトリックブートストラップ法だと考えていますが正しいでしょうか?

コードの説明

今回は与えられた標本[0,4,8,12,16,20,24,28,32,36]がある場合に、母平均を求めるためにパラメトリックブートストラップ法を使い計算しました。その際にPython3.7.1を使いました。(本来は母平均は標本平均で推定できるのでブートストラップ法を使う意味は無いと思いますが、今回は練習です。)

また要素数や標本の作成回数は実際はもっと多くないと適切に推定出来ないと思いますが、今回は自分が理解しやすくするようにあえて簡単な標本を与えて、要素数や標本の作成回数を少なくしています。

ブートストラップ標本を作成するたびに表示して、さらにブートストラップ標本の標本平均を毎回表示させています。また、標本平均のリストも表示させています。

コード(Python3.7.1を使用)

python3

1import scipy.stats 2import math 3import random 4 5# 標本のリストを作成 6test_list = [0.0,4.0,8.0,12.0,16.0,20.0,24.0,28.0,32.0,36.0] 7 8# ブートストラップ標本から得られた平均を格納するリスト「ave_list」を作成 9ave_list = [] 10 11# ブートストラップ標本の要素数を設定 12boot_ele = 8 13 14# ブートストラップ標本の作成回数を設定 15test_repeat = 10 16 17i = 0 18 19# リストの要素の標本平均を計算する関数 20def calcu_ave(list): 21 sum = 0 22 ele_num = len(list) 23 for i in range(0,ele_num): 24 sum += list[i] 25 average = sum / ele_num 26 return average 27 28# リストの要素の標準誤差を計算する関数 29def calcu_std(list): 30 sum = 0 31 ele_num = len(list) 32 ave = calcu_ave(list) 33 34 for i in range(0,ele_num): 35 sum += (list[i] - ave) ** 2 36 var = sum / (ele_num - 1) 37 std = math.sqrt(var) 38 return std 39 40# リストの要素をランダムに抽出する関数 41def select(list): 42 r = random.random() 43 if r < 0.10: 44 return list[0] 45 if 0.10 <= r < 0.20: 46 return list[1] 47 if 0.20 <= r < 0.30: 48 return list[2] 49 if 0.30 <= r < 0.40: 50 return list[3] 51 if 0.40 <= r < 0.50: 52 return list[4] 53 if 0.50 <= r < 0.60: 54 return list[5] 55 if 0.60 <= r < 0.70: 56 return list[6] 57 if 0.70 <= r < 0.80: 58 return list[7] 59 if 0.80 <= r < 0.90: 60 return list[8] 61 if 0.90 <= r: 62 return list[9] 63 64# ブートストラップ標本を作成して、その標本平均を出力する関数 65def make_list(list,dim): 66 boot_list = [] 67 for i in range(0,dim): 68 boot_list.append(select(list)) 69 boot_ave = calcu_ave(boot_list) 70 print('boot_list = ' + str(boot_list)) 71 print('boot_ave = ' + str(boot_ave) + '\n') 72 return boot_ave 73 74# 標本平均をリスト化 75for i in range(0,test_repeat): 76 ave_list.append(make_list(test_list,boot_ele)) 77 78print(ave_list) 79estim_ave = calcu_ave(ave_list) 80estim_std = calcu_std(ave_list) 81 82# 得られた標本平均がt分布に従っていると仮定 83estim_ave_range = scipy.stats.t.interval(0.95, len(ave_list) - 1, estim_ave, estim_std) 84print('average = ' + str(estim_ave)) 85print('standard deviation = ' + str(estim_std)) 86print('ave_range : ' + str(estim_ave_range))

結果

python3

1boot_list = [24.0, 20.0, 20.0, 8.0, 0.0, 32.0, 32.0, 8.0] 2boot_ave = 18.0 3 4boot_list = [28.0, 8.0, 20.0, 0.0, 28.0, 28.0, 4.0, 36.0] 5boot_ave = 19.0 6 7boot_list = [24.0, 32.0, 36.0, 0.0, 16.0, 16.0, 4.0, 20.0] 8boot_ave = 18.5 9 10boot_list = [32.0, 24.0, 16.0, 0.0, 0.0, 16.0, 16.0, 32.0] 11boot_ave = 17.0 12 13boot_list = [12.0, 32.0, 36.0, 0.0, 32.0, 24.0, 12.0, 20.0] 14boot_ave = 21.0 15 16boot_list = [16.0, 24.0, 12.0, 16.0, 12.0, 8.0, 16.0, 4.0] 17boot_ave = 13.5 18 19boot_list = [24.0, 0.0, 24.0, 12.0, 8.0, 36.0, 0.0, 28.0] 20boot_ave = 16.5 21 22boot_list = [12.0, 4.0, 32.0, 28.0, 20.0, 4.0, 0.0, 16.0] 23boot_ave = 14.5 24 25boot_list = [16.0, 12.0, 28.0, 24.0, 16.0, 36.0, 24.0, 24.0] 26boot_ave = 22.5 27 28boot_list = [4.0, 12.0, 28.0, 12.0, 0.0, 32.0, 24.0, 20.0] 29boot_ave = 16.5 30 31[18.0, 19.0, 18.5, 17.0, 21.0, 13.5, 16.5, 14.5, 22.5, 16.5] 32average = 17.7 33standard deviation = 2.7406406388125952 34ave_range : (11.500240148411041, 23.899759851588957)

計算結果

95%信頼区間も出しましたが、さすがに要素数や標本の作成回数が少ないので区間が広く推定の精度は良いとは言えないと思います。

補足

今回の質問がteratailで質問すべき内容か、それとも数学関係のサイトで質問すべきか分からなかったのですが、コードも書いたということもあり、ここで質問させていただきました。もし、タグや質問をする場所が適切でなければ申し訳ございません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suugaku_nyumon

2021/06/15 14:49

統計関係の動画も非常に多く何を見るべきか分からなかったので助かります。 この3本の動画を見てみたいと思います。
guest

回答1

0

自己解決

jbpb0さんのコメントにあります

https://youtu.be/eo6x5IAogYI
https://youtu.be/JQXAHzj6Lp0
https://youtu.be/2KuQpfazJtA

この3本の動画でプログラミング上の疑問は解決しましたので、teratailでの質問は締め切らせていただきます。

投稿2021/06/15 16:37

suugaku_nyumon

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問