0

これは非常に単純化された例ですが、うまくいけば、私が話していることを皆に理解してもらうことができます:

real.length = c(10,11,12,13,13,13,13,14,15,50)

random.length = vector() 
for (i in 1:length(real.length)){
    random.length[i] = sample(min(real.length):max(real.length),1)
}

(注意: random.length=sample(min:max,10) と言うことができることはわかっていますが、実際のコードではループが必要です。)

ランダムな長さが実際の長さと同様の範囲であるだけでなく、分布も同様であることを望みます。rnorm を試してみましたが、実際のデータには正規分布がないため、見逃したオプションがない限り、うまくいかないと思います。

実際のデータを使用してサンプル関数の確率を設定することは可能ですか? したがって、この場合、10 ~ 15 の数値の重み/確率を高くし、50 のような大きな数値の重み/確率を低くします。

編集:ジェームズのソリューションを使用:

samples = length(real.length) 
d = density(real.length)
random.length = d$x[findInterval(runif(samples+100),cumsum(d$y)/sum(d$y))]
random.length = subset(random.length, random.length>0)
random.length = random.length[1:samples]
4

2 に答える 2

0

読むことはできますがR、書くことはできません(インストールしていないので、テストできません)。あなたが尋ねたことのようなことをするMatlabの簡単な例をあなたに与えます - これがあなたにインスピレーションを与えることを願っています:

obs = sort([10 11 12 13 13 13 13 14 15 50]); % have to make sure they are sorted...
uo = unique(obs);
hh = hist(obs, uo); % find frequencies of each value
cpdf = cumsum(obs);
cpdfn = cpdf / max(cpdf); % normalized cumulative pdf
r = rand(1, 100); % 100 random numbers from 0 to 1
rv = round(interp1(cpdfn, uo, r)); % randomly pick values in the cpdfn; find corresponding "observation"
hr = hist(rv, 1:50);
hrc = cumsum(hr);
figure
plot(uo, cpdfn);
hold all;
plot(1:50, hhc/max(hhc))

figure; hist(rv, 1:50);

これにより、次のプロットが生成されます。 ここに画像の説明を入力

ここに画像の説明を入力

注 - 観測が多いほど、これはうまく機能します。現在の例では、サンプルが比較的少ないため、15 から 50 の間のスペースが約 10% の確率でサンプリングされます。

于 2013-03-19T16:44:30.523 に答える
0

densityそこから見積もりとサンプルを作成できます。

d <- density(real.length)
d$x[findInterval(runif(6),cumsum(d$y)/sum(d$y))]
[1] 13.066019 49.591973  9.636352 15.209561 11.951377 12.808794

これは、変数が連続的であることを前提としているためround、適切であることに注意してください。

于 2013-03-19T16:20:15.467 に答える