漏斗プロットを使用して実際のデータの信頼帯を作成するために、ブートストラップを介してデータをシミュレートしようとしています。以前の質問に対する受け入れられた回答の戦略に基づいて構築して います。データをシミュレートするために単一の確率分布を使用する代わりに、シミュレートされるデータの部分に応じて異なる確率分布を使用するように変更したいと考えています。
質問に答えるのを手伝ってくれる人、または質問をより明確に表現するのを手伝ってくれる人に感謝します。
私の問題は、適切な R コードを記述して、より複雑な形式のデータ シミュレーションを行うことです。
現在のコードは次のとおりです。
n <- 1e4
set.seed(42)
sims <- sapply(1:80,
function(k)
rowSums(
replicate(k, sample((1:7)/10, n, TRUE, ps))) / k)
このコードは、各データ ポイントが1:80
観測間の平均である値を持つデータをシミュレートします。たとえば、データ ポイントの値が 10 回の観測値の平均 ( =10) である場合、確率分布にk
基づいて 10 個の値 (0.1、0.2、0.3、0.4、0.5、0.6 または 0.7 のいずれか) をランダムにサンプリングします。ps
これにより、各値の確率が得られます (経験的分布全体に基づく)。
ps は次のようになります。
ps <- prop.table(table((DF$mean_score)[DF$total_number_snps == 1]))
# 0.1 0.2 0.3 0.4 0.5 0.6 0.7
#0.582089552 0.194029851 0.124378109 0.059701493 0.029850746 0.004975124 0.004975124
たとえば、観測値が である確率は0.1
です0.582089552
。
ここで、すべてのシミュレーションに 1 つの度数分布を使用する代わりに、各データポイントの基礎となる観測の数に応じて、条件付きで異なる度数分布を使用したいと考えています。
cond_probs
実際のデータ ポイントごとに 1 つの行を含むテーブル を作成しました。オブザベーションの数を示す列と、total
各オブザベーションの各値の頻度を示す列があります。
cond_probs テーブルの例:
gene_name 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 total
A1 0.664 0.319 0.018 0.000 0.000 0.000 0.000 0.000 0.000 113.000
A2 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000
したがって、データ ポイントについては、値が である観測A2
のみがあります。したがって、観測頻度は です。については、観察があり、それらの大部分 ( ) は値を持っています。考え方は に似ていますが、すべてのデータに対して 1 つの確率分布ではなく、各データ ポイントに対して確率分布があります。1
0.1
0.1
1
A1
113
0.664
0.1
cond_probs
ps
cond_probs
上記のコードを変更して、頻度分布のcond_probs
代わりに使用するようにサンプリングを変更したいと思います。また、どの行からサンプリングするかを選択する際の基準として、ps
観測数 を使用します。したがって、次のように機能します。k
cond_probs
k
観測数のあるデータ ポイントの場合:
テーブルを見て、観測値の数が k: と同じサイズcond_probs
の行をランダムに選択します。そのような行が存在しない場合は、続行します。total
0.9k-1.1k
データポイントが選択されると、元のコードで使用されているのとcond_probs
同じように、その行の確率分布を使用して、観測数をランダムにサンプリングし、これらの観測値の平均を出力します。ps
k
n
の反復ごとに、の値が( )の現在の値と類似しているすべての行replicate
から、 から新しいデータ ポイントを置換してランダムにサンプリングします。cond_probs
total
k
0.9k-1.1k
このデータセットでは、データ ポイントの基礎となる観測の数に基づいて、どの確率分布を使用するかを調整する必要があります。これは、このデータセットでは、観察の確率が観察数の影響を受けるためです (SNP が多い遺伝子は、遺伝的連鎖と背景選択により、観察ごとのスコアが低くなる傾向があります)。
以下の回答を使用して更新:
以下の回答を使用してみましたが、例のシミュレートされた cond_probs データでは機能しますが、実際の cond_probs ファイルでは機能しません。cond_probs ファイルをインポートしてマトリックスに変換しました
cond_probs <- read.table("cond_probs.txt", header = TRUE, check.names = FALSE)
cond_probs <- as.matrix(cond_probs)
最初の例の 10 行 (~20,000 行のうち) は次のようになります。
>cond_probs
total 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
[1,] 109 0.404 0.174 0.064 0.183 0.165 0.009 0.000 0.000 0.000 0.000
[2,] 181 0.564 0.221 0.144 0.066 0.006 0.000 0.000 0.000 0.000 0.000
[3,] 289 0.388 0.166 0.118 0.114 0.090 0.093 0.028 0.003 0.000 0.000
[4,] 388 0.601 0.214 0.139 0.039 0.008 0.000 0.000 0.000 0.000 0.000
[5,] 133 0.541 0.331 0.113 0.000 0.008 0.008 0.000 0.000 0.000 0.000
[6,] 221 0.525 0.376 0.068 0.032 0.000 0.000 0.000 0.000 0.000 0.000
[7,] 147 0.517 0.190 0.150 0.054 0.034 0.048 0.007 0.000 0.000 0.000
[8,] 107 0.458 0.196 0.252 0.084 0.009 0.000 0.000 0.000 0.000 0.000
[9,] 13 0.846 0.154 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
私が実行した場合:
sampleSize <- 20
set.seed(42)
#replace 1:80 with 1: max number of SNPs in gene in dataset
sims_test <- sapply( 1:50, simulateData, sampleSize )
x個の観測値でサンプリングの平均を見てください。20個あるはずなのに、1つの結果しか得られません。
例えば:
> sims_test[[31]]
[1] 0.1
Andsims_test
は と同じ順序ではありませんsims
:
>sims_test
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0.1 0.1 0.1666667 0.200 0.14 0.2666667 0.2000000 0.2375 0.1888889
[2,] 0.1 0.1 0.1333333 0.200 0.14 0.2333333 0.1571429 0.2625 0.1222222
[3,] 0.1 0.1 0.3333333 0.225 0.14 0.1833333 0.2285714 0.2125 0.1555556
[4,] 0.1 0.1 0.2666667 0.250 0.10 0.1500000 0.2000000 0.2625 0.2777778
[5,] 0.1 0.1 0.3000000 0.200 0.16 0.2000000 0.2428571 0.1750 0.1000000
[6,] 0.1 0.1 0.3666667 0.250 0.16 0.1666667 0.2142857 0.2500 0.2000000
[7,] 0.1 0.1 0.4000000 0.300 0.12 0.2166667 0.1857143 0.2375 0.1666667
[8,] 0.1 0.1 0.4000000 0.250 0.10 0.2500000 0.2714286 0.2375 0.2888889
[9,] 0.1 0.1 0.1333333 0.300 0.14 0.1666667 0.1714286 0.2750 0.2888889
更新 2
を使用cond_probs <- head(cond_probs,n)
して、コードが n = 517 まで機能すると判断した後、これよりも大きいすべてのサイズに対して、上記と同じ出力が生成されます。これがファイル自体の問題なのか、メモリの問題なのかはわかりません。行 518 を削除し、行を数回前に複製してより大きなファイルを作成すると、行自体が問題を引き起こしていることがわかりました。518 行目は次のようになります。
9.000 0.889 0.000 0.000 0.000 0.111 0.000 0.000 0.000 0.000 0.000
私は別の4つの問題のある行を見つけました:
9.000 0.444 0.333 0.111 0.111 0.000 0.000 0.000 0.000 0.000 0.000
9.000 0.444 0.333 0.111 0.111 0.000 0.000 0.000 0.000 0.000 0.000
9.000 0.111 0.222 0.222 0.111 0.111 0.222 0.000 0.000 0.000 0.000
9.000 0.667 0.111 0.000 0.000 0.000 0.222 0.000 0.000 0.000 0.000
私はそれらについて何も異常に気づきません。それらはすべて「合計」で 9 つのサイトを持っています。これらの行を削除して、これらの前の行のみを含む「cond_probs」ファイルを実行すると、コードが機能します。しかし、「cond_probs」全体がまだ機能しないため、他にも問題のある行があるはずです。
これらの問題のある行を小さな「cond_probs」ファイルに戻そうとしたところ、このファイルは機能するため、行に本質的に問題があるようには見えないため、非常に混乱しています。一方、全部で 9 つのサイトがあるという事実は、何らかの原因パターンを示唆しています。
トラブルシューティングのために次に何をすべきかわからないので、それが役立つ場合は、ファイル全体を非公開で共有できれば幸いです.
発生するもう 1 つの問題は、コードが期待どおりに機能しているかどうかわからないことです。「合計」が「1」の観測値を持つ 2 つのデータ ポイントがあるダミーの cond_probs ファイルを作成しました。
total 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
1.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000
1.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
したがって、それらは両方とも「1」の観測値でデータポイントに対してサンプリングされるため、平均値が「0.2」で観測値の約 50%、平均が「0.6」で 50% になると予想されます。ただし、平均は常に 0.2 です。
sims_test[[1]]
[1] 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2
10000 回サンプリングしても、すべての観測値は 0.2 であり、決して 0.6 ではありません。私のコードの理解では、観察ごとに同様のサイズの cond_probs から新しい行をランダムに選択する必要がありますが、この場合はそうではないようです。コードを誤解していますか、それとも入力が正しくないという問題がありますか?
cond_probs ファイル全体は、次のアドレスにあります。
更新 3
シミュレーションの実行時に変更sapply
すると、この問題が修正されました。lapply
もう 1 つの理由は、そのままcond_probs
にして分布sampleSize
を何度も選択することが最善の解決策である可能性があることです。分布を選択する確率は、cond_probs
. 分布を組み合わせると、分布を選択するオッズは、これらの合計の観測total
9
数10
に依存しなくなります。例: と を含むディストリビューションがある場合、を90
含むディストリビューションを選択する機会があるはずです。分布を組み合わせると、'total'= 9 または 10 の分布を選択する確率は 50/50 になりませんか (これは理想的ではありません)。total=10
10
total=9
90%
total=10