Main Content

bootstrp

ブートストラップ サンプリング

説明

bootstat = bootstrp(nboot,bootfun,d) は、d から nboot 個のブートストラップ データ標本を抽出し、関数 bootfun を使用して各標本に対する統計量を計算し、bootstat に結果を返します。関数 bootstrp は、d の行から復元抽出することで各ブートストラップ標本を作成します。出力引数 bootstat の各行は、ブートストラップ標本に bootfun を適用した結果を含みます。

bootstat = bootstrp(nboot,bootfun,d1,...,dN) は、dl,...,dN のデータから nboot 個のブートストラップ標本を抽出します。dl,...,dN の非スカラー データ引数は、同じ行数 n でなければなりません。関数 bootstrp は、インデックス 1:n から復元抽出して各ブートストラップ標本を作成し、非スカラー dl,...,dN の対応する行を選択します。この関数は、dl,...,dN の非スカラー データ引数および変更されていないスカラー データ引数の標本を bootfun に渡します。

bootstat = bootstrp(___,Name,Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、観測値の重みをデータに追加したり、ブートストラップ反復を並列で計算したりできます。

[bootstat,bootsam] = bootstrp(___) は、ブートストラップ標本のインデックスから成る nnboot 列の行列 bootsam も返します。ここで、n は元の非スカラー データの行数です。bootsam の各列は、1 つのブートストラップ標本に対応しており、標本を作成するために非スカラー データから抽出された行インデックスの値が格納されます。

標本に関数を適用せずにブートストラップ標本のインデックスを取得するには、bootfun を空 ([]) に設定してください。

すべて折りたたむ

ブートストラッピングされた平均値のカーネル密度を推定します。

平均 5 をもつ指数分布から 100 個の乱数を生成します。

rng('default')  % For reproducibility
y = exprnd(5,100,1);

ベクトル y から取得した無作為な標本を使用して、100 個のブートストラッピングされた平均値の標本を計算します。

m = bootstrp(100,@mean,y);

ブートストラッピングされた平均値の密度の推定値をプロットします。

[fi,xi] = ksdensity(m);
plot(xi,fi)

Figure contains an axes object. The axes object contains an object of type line.

100 個のブートストラップ標本の平均値と標準偏差を計算してプロットします。

平均 5 をもつ指数分布から 100 個の乱数を生成します。

rng('default')  % For reproducibility
y = exprnd(5,100,1);

ベクトル y から無作為に取得された標本により、100 個のブートストラッピングされた平均値と標準偏差の標本を計算します。

stats = bootstrp(100,@(x)[mean(x) std(x)],y);

ブートストラッピングされた推定値のペアをプロットします。

plot(stats(:,1),stats(:,2),'o')
xlabel('Mean')
ylabel('Standard Deviation')

Figure contains an axes object. The axes object contains an object of type line.

患者データのブートストラップ標本を取得し、各データ標本の平均測定値を計算し、その結果を可視化します。

patients データセットを読み込みます。年齢、体重、身長の測定値が格納された行列 patientData を作成します。patientData の各行は、1 人の患者に対応します。

load patients
patientData = [Age Weight Height];

patientData のデータから、200 個のブートストラップ データ標本を作成します。各標本を作成するため、patientData の行から、100 行 (すなわち size(patientData,1)) が復元抽出で無作為に選択されます。各標本について、年齢、体重、身長の測定値の平均を計算します。bootstat の各行には、1 つのブートストラップ標本に対する 3 つの平均測定値が格納されます。

rng('default') % For reproducibility
bootstat = bootstrp(200,@mean,patientData);

200 個のすべてのブートストラップ データ標本について、平均測定値を可視化します。平均体重が大きいブートストラップ標本ほど平均身長が大きくなる傾向があることに注意してください。

scatter3(bootstat(:,1),bootstat(:,2),bootstat(:,3))
xlabel('Mean Age')
ylabel('Mean Weight')
zlabel('Mean Height')

view([-75 10])

Figure contains an axes object. The axes object contains an object of type scatter.

標本データのブートストラップ リサンプリングを使用して、相関係数の標準誤差を計算します。

15 人の学生の LSAT スコアと法律学校の GPA の lawdata データセットを読み込みます。

load lawdata
rng('default')  % For reproducibility
size(lsat)
ans = 1×2

    15     1

size(gpa)
ans = 1×2

    15     1

15 個のデータ点をリサンプリングして 1000 個のデータ標本を作成し、データ標本ごとに 2 つの変数の相関関係を計算します。

[bootstat,bootsam] = bootstrp(1000,@corr,lsat,gpa);

最初から 5 番目までのブートストラップ相関係数を表示します。

bootstat(1:5,:)
ans = 5×1

    0.9874
    0.4918
    0.5459
    0.8458
    0.8959

最初から 5 番目までのブートストラップ標本について選択されたデータのインデックスを表示します。

bootsam(:,1:5)
ans = 15×5

    13     3    11     8    12
    14     7     1     7     4
     2    14     5    10     8
    14    12     1    11    11
    10    15     2    12    14
     2    10    13     5    15
     5     1    11    11     9
     9    13     5    10     3
    15    15    15     3     3
    15    11     1     2     4
      ⋮

すべてのブートストラップ標本間の相関係数のばらつきを示すヒストグラムを作成します。

histogram(bootstat)

Figure contains an axes object. The axes object contains an object of type histogram.

最小の標本は正の指標になっており、LSAT のスコアと GPA の関係が偶然でないことを示しています。

最後の推定相関係数の誤差のブートストラップ基準を計算します。

se = std(bootstat)
se = 0.1285

異なる観測値の重みをもつブートストラップ標本を比較します。各標本の統計量を計算するカスタム関数を作成します。

1 ~ 6 の数字から 50 個のブートストラップ標本を作成します。各標本を作成するため、bootstrp によって、1 ~ 6 の数字が復元抽出で無作為に 6 回選択されます。この処理は、サイコロを 6 回転がすのに似ています。カスタム関数 countfun (この例の終わりに掲載) を使用して、各標本内の 1 の数を数えます。

rng('default') %For reproducibility
counts = bootstrp(50,@countfun,(1:6)');

メモ: この例のライブ スクリプト ファイルを使用している場合、関数 countfun は既にファイルの終わりに含まれています。それ以外の場合は、この関数を .m ファイルの終わりに作成するか、MATLAB® パス上のファイルとして追加する必要があります。

1 ~ 6 の数字から 50 個のブートストラップ標本を作成します。ただし、各値に異なる重みを割り当てます。bootstrp で 1 ~ 6 の数字を無作為に選択するとき、1 が選択される確率は常に 0.5、2 が選択される確率は常に 0.1 (以下同様) となります。再び、countfun を使用して各標本内の 1 の数をカウントします。

weights = [0.5 0.1 0.1 0.1 0.1 0.1]';
weightedCounts = bootstrp(50,@countfun,(1:6)','Weights',weights);

ヒストグラムを使用して、2 つのブートストラップ標本のセットを比較します。

histogram(counts)
hold on
histogram(weightedCounts)
legend
xlabel('Number of 1s in Sample')
ylabel('Number of Samples')
hold off

Figure contains an axes object. The axes object contains 2 objects of type histogram.

この 2 つのブートストラップ標本のセットは、分布が異なります。特に、2 番目のセットには 1 がより多く含まれる傾向があります。たとえば、最初のセットでは、50 個の標本のうち 1 の個数が 2 つよりも多い標本は 2 つしかありません。一方、2 番目のセット (観測値に重みが割り当てられたセット) では、50 個の標本のうち 1 の個数が 2 つよりも多い標本は 12+14+4+2=32 個あります。

次のコードは、関数 countfun を作成します。

function numberofones = countfun(sample)
numberofones = sum(sample == 1);
end

残差をブートストラッピングして、線形回帰の係数ベクトルの標準誤差を推定します。

メモ: この例では regress を使用します。これは、回帰モデルの係数推定値または残差が必要な場合や、ブートストラッピングのようにモデルを複数回繰り返して当てはめる必要がある場合に便利です。当てはめた回帰モデルをさらに調べる必要がある場合は、fitlm を使用して線形回帰モデル オブジェクトを作成します。

標本データを読み込みます。

load hald

線形回帰を実行し、残差を計算します。

x = [ones(size(heat)),ingredients];
y = heat;
b = regress(y,x);
yfit = x*b;
resid = y - yfit;

残差をブートストラッピングして標準誤差を推定します。

se = std(bootstrp(1000,@(bootr)regress(yfit+bootr,x),resid))
se = 1×5

   56.1752    0.5940    0.5815    0.5989    0.5691

入力引数

すべて折りたたむ

ブートストラップ標本の数。正の整数スカラーとして指定します。各ブートストラップ標本を作成するため、bootstrp によって、d または d1,...,dN 内の n 行の (非スカラー) データから n 行が復元抽出で無作為に選択されます。

例: 100

データ型: single | double

各標本に適用する関数。関数ハンドルとして指定します。カスタム関数または組み込み関数を指定できます。bootfun は記号 @ を使用して指定しなければなりません。

カスタム関数を使用する例については、異なる観測値の重みをもつブートストラップ標本の比較を参照してください。

例: @mean

データ型: function_handle

標本を取得する元のデータ。列ベクトルまたは行列として指定します。dn 行が観測値に対応します。複数のデータ入力引数 d1,...,dN を使用する場合、いくつかの引数をスカラー値として指定することができますが、非スカラー引数の行数はすべて同じでなければなりません。

単一のベクトル引数 d を使用する場合、それを行ベクトルとして指定できます。bootstrp は次に、ベクトルの要素からサンプルを抽出します。

データ型: single | double | logical | char | string | cell | categorical

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: bootstrp(4,@mean,(1:2)','Weights',[0.4 0.6]') は、12 の値から 4 つのブートストラップ標本を抽出し、各標本の平均を取ることを指定します。標本を抽出するときの、1 を得る確率は 0.42 を得る確率は 0.6 です。

観測値の重み。'Weights'、および正の要素を 1 つ以上含む非負のベクトルで構成される、コンマ区切りのペアとして指定します。Weights の要素数は、d または d1,...,dN のデータの行数 n と等しくなければなりません。1 つのブートストラップ標本を取得するために、bootstrp は、多項分布抽出確率として重みを使用し、n 行のデータから n 行を復元抽出で無作為に選択します。

データ型: single | double

ブートストラップ反復の並列計算、およびブートストラップ サンプリング時の乱数設定のオプション。'Options' と構造体で構成されるコンマ区切りのペアとして指定します。statset を使用して Options 構造体を作成します。次の表は、オプションのフィールドとその値の一覧です。

フィールド名既定の設定
UseParallelブートストラップ反復を並列計算する場合は、この値を true に設定します。false
UseSubstreams

再生可能な方法で並列計算する場合は、この値を true に設定します。

再現性のある計算を行うには、Streams をサブストリームを許可する型 ('mlfg6331_64' または 'mrg32k3a') に設定します。

false
StreamsRandStream オブジェクトまたはそのようなオブジェクトの cell 配列としてこの値を指定します。UseParallel の値が true でなく、UseSubstreams の値も false でない場合、単一オブジェクトを使用します。この場合は、並列プールと同じサイズの cell 配列を使用します。Streams を指定しなかった場合、bootstrp は既定のストリームを使用します。

メモ

並列計算を行うには、Parallel Computing Toolbox™ が必要です。

例: 'Options',statset('UseParallel',true)

データ型: struct

出力引数

すべて折りたたむ

ブートストラップ標本の統計量。nboot 行の列ベクトルまたは行列として返されます。bootstati 番目の行は、i 番目のブートストラップ標本に bootfun を適用した結果に対応します。bootfun が行列または配列を返す場合、関数 bootstrp はこの出力を bootstat に保存する前に行ベクトルに変換します。

ブートストラップ標本のインデックス。nnboot 列の数値行列として返されます。ここで、n は元の非スカラー データの行数です。bootsam の各列は、1 つのブートストラップ標本に対応しており、標本を作成するために非スカラー データから抽出された行インデックスの値が格納されます。

たとえば、d1,...,dN の各データ入力引数が 16 個の値を含み、nboot = 4 の場合、bootsam は 16 行 4 列の行列となります。1 列目には最初のブートストラップ標本の d1,...,dN から抽出された 16 個の値のインデックスが格納され、2 列目には、2 番目のブートストラップ標本のインデックスが格納されます (以下同様)。ブートストラップ標本のインデックスは、すべての入力データセット d1,...,dN に対して同じです。

ヒント

  • 標本に関数を適用せずにブートストラップ標本のインデックス bootsam を取得するには、bootfun を空 ([]) に設定してください。

拡張機能

バージョン履歴

R2006a より前に導入