Main Content

datasample

復元/非復元抽出法によるデータの無作為抽出

説明

y = datasample(data,k) は、data 内のデータから復元抽出法により一様に無作為抽出された k 個の観測値を返します。

y = datasample(data,k,dim) は、data の次元 dim に沿って取得された標本を返します。

y = datasample(___,Name,Value) は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して、前の構文における入力引数のいずれかに対して標本を返します。たとえば、'Replace',false は非復元抽出を指定します。

y = datasample(s,___) は乱数ストリーム s を使用して乱数を生成します。s オプションは、上記の構文で入力引数より前に指定できます。

[y,idx] = datasample(___) は、前の構文の入力引数のいずれかを使用して、datasampledata から抽出した値を示すインデックス ベクトルも返します。

すべて折りたたむ

再現性を得るため、乱数ストリームを作成します。

s = RandStream('mlfg6331_64'); 

1 から 10 までの整数から 5 つの一意な値を抽出します。

y = datasample(s,1:10,5,'Replace',false)
y = 1×5

     9     8     3     6     2

再現性を得るため、乱数ストリームを作成します。

s = RandStream('mlfg6331_64');

指定された確率に従って、ACGT という系列から 48 個のランダムな文字を生成します。

seq = datasample(s,'ACGT',48,'Weights',[0.15 0.35 0.35 0.15])
seq = 
'GGCGGCGCAAGGCGCCGGACCTGGCTGCACGCCGTTCCCTGCTACTCG'

結果の再現性を得るため、乱数シードを設定します。

rng(10,'twister') 

10 行 1000 列の行列を生成します。

X = randn(10,1000);

datasample 内での再現性を得るため、乱数ストリームを作成します。

s = RandStream('mlfg6331_64');

X から 5 つの一意な列を無作為に選択します。

Y = datasample(s,X,5,2,'Replace',false)
Y = 10×5

    0.4317   -0.3327    0.9112   -2.3244    0.9559
    0.6977   -0.7422    0.4578   -1.3745   -0.8634
   -0.8543   -0.3105    0.9836   -0.6434   -0.4457
    0.1686    0.6609   -0.0553   -0.1202   -1.3699
   -1.7649   -1.1607   -0.3513   -1.5533    0.0597
   -0.3821    0.5696   -1.6264   -0.2104   -1.5486
   -1.6844    0.7148   -0.6876   -0.4447   -1.4615
   -0.4170    1.3696    1.1874   -0.9901    0.5875
   -0.2410    1.4703   -2.5003   -1.1321   -1.8451
    0.6212    1.4118   -0.4518    0.8697    0.8093

ブートストラップ複製データ セットを作成するため、データ セット配列から観測値を再抽出します。ブートストラッピングの詳細については、ブートストラップ リサンプリングを参照してください。

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

load hospital

hospital データ セットから復元抽出された無作為標本が含まれている、hospital データ セットと同じサイズのデータ セットを作成します。

y = datasample(hospital,size(hospital,1));

別のベクトルから選択した標本のインデックスに基づいて、データから標本を選択します。

2 つのランダムなベクトルを生成します。

x1 = randn(100,1);
x2 = randn(100,1);

10 個の要素の標本をベクトル x1 から選択し、ベクトル idx 内の標本のインデックスを取得します。

[y1,idx] = datasample(x1,10);

ベクトル idx のインデックスを使用して、10 個の要素の標本をベクトル x2 から選択します。

y2 = x2(idx);

入力引数

すべて折りたたむ

抽出元の入力データ。ベクトル、行列、多次元配列、テーブルまたはデータセット配列を指定します。既定では datasampledata の、大きさが 1 でない最初の次元から標本を抽出します。たとえば、data が行列である場合、datasample は行から標本を抽出します。dim 入力引数でこの動作を変更します。

データ型: single | double | logical | char | string | table

標本の個数。正の整数を指定します。

例: datasample(data,100) は、data 内のデータから一様に無作為抽出された 100 個の観測値を返します。

データ型: single | double

抽出する次元。正の整数を指定します。たとえば、data が行列で、dim2 の場合、y には data 内で選択した列が含まれます。data がテーブルまたはデータセット配列で、dim2 の場合、y には data 内で選択した変数が含まれます。dim を使用すると、data がベクトル、行列、N 次元配列のいずれであるかに関係なく、特定の次元に沿って標本を抽出できます。

データ型: single | double

乱数ストリーム。グローバル ストリームまたは RandStream を指定します。たとえば、s = RandStream('mlfg6331_64') は乗法ラグ フィボナッチ発生器アルゴリズムを使用する乱数ストリームを作成します。詳細については、乱数ストリームの作成と管理を参照してください。

関数 rng は、グローバル ストリームを制御するための簡単な方法を提供します。たとえば、rng(seed) は非負の整数シードを使用して乱数発生器のシードを設定します。詳細については、RandStream を使用したグローバル ストリームの管理を参照してください。

名前と値の引数

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

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

例: 'Replace',false,'Weights',ones(datasize,1) は、Weights の要素に比例する確率で非復元抽出を行います。datasize は抽出対象の次元のサイズです。

復元抽出のインジケーター。'Replace'true または false のいずれかから構成されるコンマ区切りのペアとして指定します。

'Replace'true の場合は復元抽出、'Replace'false の場合は非復元抽出。'Replace'false の場合、k は、標本が抽出される次元のサイズを超えてはなりません。たとえば、data = [1 3 Inf; 2 4 5] および y = datasample(data,k,'Replace',false) である場合、k2 より大きくすることはできません。

データ型: logical

抽出の重み。'Weights' と非負の数値ベクトルから構成されるコンマ区切りのペアとして指定します。ベクトルのサイズは datasize です。datasize は抽出対象の次元のサイズです。ベクトルには正の値が 1 つ以上含まれていなければならず、NaN 値を含めることはできません。関数 datasample は、'Weights' の要素に比例する確率で標本を抽出します。

例: 'Weights',[0.1 0.5 0.35 0.46]

データ型: single | double

出力引数

すべて折りたたむ

標本。ベクトル、行列、多次元配列、テーブルまたはデータセット配列として返されます。

  • data がベクトルである場合、y は、data から選択された k 個の要素が含まれているベクトルになります。

  • data が行列であり、dim = 1 である場合、y は、data から選択された k 個の行が含まれている行列になります。または、dim = 2 である場合、y は、data から選択された k 個の列が含まれている行列になります。

  • data が N 次元配列であり、dim = 1 である場合、y は、大きさが 1 でない最初の次元に沿って data から抽出された標本が含まれている N 次元配列になります。または、名前と値のペアの引数 dim の値を指定した場合、datasample は次元 dim に沿って標本を抽出します。

  • data がテーブルであり、dim = 1 である場合、y は、data から選択された k 個の行が含まれているテーブルになります。または、dim = 2 である場合、y は、data から選択された k 個の変数が含まれているテーブルになります。

  • data がデータセット配列であり、dim = 1 である場合、y は、data から選択された k 個の行が含まれているデータセット配列になります。または、dim = 2 である場合、y は、data から選択された k 個の変数が含まれているデータセット配列になります。

NaN 値で表される欠損観測値が入力 data に含まれている場合、datasampleNaN 値を含む入力全体から標本を抽出します。たとえば、y = datasample([NaN 6 14],2)y = NaN 14 を返す可能性があります。

復元抽出法により標本が取得される場合 (既定)、、y には data からの反復観測値を含めることができます。非復元抽出を行うには、名前と値のペアの引数 Replacefalse に設定します。

インデックス。y を作成するために datasampledata から選択した要素を示すベクトルとして返されます。以下に例を示します。

  • data がベクトルである場合、y = data(idx) になります。

  • data が行列であり dim = 1 である場合、y = data(idx,:) になります。

  • data が行列であり dim = 2 である場合、y = data(:,idx) になります。

ヒント

  • ある範囲からの復元抽出法による整数の無作為抽出には randi を使用します。

  • 非復元抽出法による整数の無作為抽出には、randperm または datasample を使用します。

  • 復元/非復元抽出法によるデータの無作為抽出には、datasample を使用します。

アルゴリズム

datasample は、randpermrand、または randi を使用して、ランダムな値を生成します。このため、datasample により、MATLAB® グローバル乱数発生器の状態が変化します。rng を使用して、乱数発生器を制御できます。

非復元抽出による重み付き標本を選択する場合、datasample は Wong および Easton のアルゴリズム [1] を使用します。

代替機能

randi または randperm を使用して、復元/非復元法による無作為抽出のインデックスをそれぞれ生成できます。しかし、データから直接抽出されるので、datasample を使用する方がより便利な場合があります。datasample では、加重抽出を行うこともできます。

参照

[1] Wong, C. K. and M. C. Easton. "An Efficient Method for Weighted Sampling Without Replacement." SIAM Journal of Computing 9(1), pp. 111–113, 1980.

拡張機能

バージョン履歴

R2011b で導入