2017-01-05 5 views
0

Rの小さなデータセットの分布に基づいて大きなデータセットをサンプリングしたいと思います。私はRで比較的新しいので、これが簡単であれば謝罪します。しかし、私はいくつか試みたsolutionsR内の別のデータセットの分布に基づいてデータをサンプリングする方法

ここにいくつかのサンプルデータがあります。次のように2つのデータセットの

# Set seed 
set.seed(2) 

# Create smaller observed data 
Obs <- rnorm(1000, 5, 2.5) 

# Create larger modeled data 
set.seed(2) 
Model <- rnorm(10000, 8, 1.5) 

分布は以下のとおりです:私はそれを観察し、モデルと呼ぶことにします enter image description here

目標:私は "小さいと一致するように、より大きな「モデル」データセットをサンプリングしたいと思います観察された "。私は、異なるデータポイントが関係しているので、それは直接の一致ではないことを理解しています。

私は次のようにしますdensity()sample()上に読んでされています:

# Obtain the density of the observed at the length of the model. 
# Note: info on the sample() function stated the prob argument in the sample() function 
# must be the same length as what's being sampled. Thus, n=length(Model) below. 

dens.obs <- density(Obs, n=length(Model)) 

# Sample the Model data the length(Obs) at the probability of density of the observed 
set.seed(22) 
SampleMod <- sample(Model, length(Obs), replace=FALSE, prob=dens.obs$y) 

これは私に(尾を除く)古いと非常によく似ています新しいプロットできます: enter image description here

私はより良いマッチを望んでいました。そこで私はモデルデータの密度関数を使って調べ始めました。下記参照:ここ

# Density function on model, length of model 
dens.mod <- density(Model, n=length(Model)) 

# Sample the density of the model $x at the density of the observed $ y 
set.seed(22) 
SampleMod3 <- sample(dens.mod$x, length(Obs), replace=FALSE, prob=dens.obs$y) 

は、二つのプロットである、第一のサンプリング最初と同じであり、第二は、サンプリングされた第二ある: enter image description here

右のプロットでより望ましいシフトがあり、これは観察された密度によってモデル化されたサンプリングされた密度を表す。ただし、データは同じではありません。つまり、私はモデリングされたデータをサンプリングしませんでした。以下を参照してください:

summary(SampleMod3 %in% Model) 

は生成します。

Mode FALSE NA's 
logical 1000  0 

を私はモデル化されたデータをサンプリングではなく、モデル化されたデータの密度がなかったことを示しています。別のデータセットの分布に基づいてデータセットをサンプリングすることは可能ですか?前もって感謝します。

EDIT:すべてのヘルプみんなのため

ありがとう!ここで私のプロットは、ダニエルソンから提供され、ベタナイプによってサポートされたapproxfun()機能を使用しています。

enter image description here

なぜファンキーな新しい分布を理解することで任意のヘルプ?

答えて

1

興味深い質問です。私はこれが助けると思う。まず、密度関数を近似します。次に、フィッティングされた密度の確率でモデル点からサンプリングします。

predict_density = approxfun(dens.obs) #function that approximates dens.obs 
#sample points from Model with probability distr. of dens.obs 
SampleMod3 <- sample(Model, length(Obs), replace=FALSE, prob=predict_density(Model)) 
summary(SampleMod3 %in% Model) 
    Mode TRUE NA's 
logical 1000  0 
+1

同時に2つの異なる方法で同じ回答を書いていたように見えます。私は説明のために行った、あなたはどのように機能するために行った...素晴らしい呼び出し!私は正しい軌道に乗っていることを常に知っておいてよかった! – sconfluentus

+0

あなたのおかげで両方。私は上記の「ハウツー」ソリューションを使用し、私の質問の編集セクション(上記)で配布を入手しました。ファンキーな新しいディストリビューションを理解するための助け? – Phil

1

実際には、実際には無作為に生成されたデータの実際のセットを使用しているとします。この場合、ランダムサンプリング法はデータにパターンがないことを意味しないため、異なるサンプルの可能性のある値は出現する可能性があります。荒野では、実際のものは実際の周波数を持ち、これはあなたのメタサンプルに表示されます。

したがって、オリジナルから小さいサブサンプルを選択する際には、重み付き確率を使用する必要があります。

例全体母集団各数の確率が描かれている{1,2,1,3,4,1,3} (和は1に等しくなければならない覚えている): 1:0.4285 2:0.1429 3:0.2857 4:0.1429

あなたは

sample(x, size, replace = FALSE, prob = my_freqs) 

prob= my_freqs一部でこれらの重み付き確率を使用する場合は、おそらくあなたが期待していたものと確率より多くのインラインを取得します。しかし、これがあなたの後であるならば、私は100%確信していません。

ランダムデータでは、set.seed(2)を試して、元のセット作成でそれらの周波数を生成するために使用されたシードを使用するようにRに指示すると、あなたの目標に近づきます。

私は、各セットに関連する普遍的なランダム式があることを知っています。私はそれがランダムな方法のさまざまなセットのためのそれらを生成する方法の周波数確率のセットであると仮定しなければならないので、ランダムセットからサンプリングする前にそれを使用するのを助けるかもしれません。

関連する問題