2016-05-18 1 views
2

Rのr2dtable関数を使用して、指定された余白を使って不調和テーブルを生成しています。しかし、得られたテーブルの値を調べると、中間点にいくらか集中しているように見えます。例:r2dtable contingencyテーブルが集中しています

set.seed(1) 
matrices <- r2dtable(1e4, c(100, 100), c(100, 100)) 
vec.vals <- vapply(matrices, function(x) x[1, 1], numeric(1)) 

> table(vec.vals) 
vec.vals 
    36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 
    1 1 1 7 25 49 105 182 268 440 596 719 954 1072 1152 1048 
    52 53 54 55 56 57 58 59 60 61 62 
1022 775 573 404 290 156 83 50 19 6 2 

最小の左上隅の値は36で、最大値は10,000のシミュレーションのうち62です。

やや低濃度のマトリックスを得る方法はありますか?

答えて

1

マトリックスの密度を低くするには、列数/行数、合計数、マトリックス数のバランスを取る必要があります。次のセットを考えてみましょう:

> length(unique(unlist(m2rep))) 
[1] 29 
> length(unique(unlist(m2seq))) 
[1] 58 

でこれをプロットする:ユニークな値の数の違い与え

m2rep <- r2dtable(1e4, rep(100,2), rep(100,2)) 
m2seq <- r2dtable(1e4, seq(50,100,50), seq(50,100,50)) 

par(mfrow = c(1,2)) 
plot(table(unlist(m2rep))) 
plot(table(unlist(m2seq))) 

が与える:

enter image description here

今考える:

par(mfrow = c(1,2)) 
plot(table(unlist(m20rep))) 
plot(table(unlist(m20seq))) 

が与える:

enter image description here

あなたのようにこれをプロットする

> length(unique(unlist(m20rep))) 
[1] 20 
> length(unique(unlist(m20seq))) 
[1] 130 

m20rep <- r2dtable(1e4, rep(100,20), rep(100,20)) 
m20seq <- r2dtable(1e4, seq(50,1000,50), seq(50,1000,50)) 

与えます見ることができる、パラメータで遊ぶのが助けます。

あなたは任意のランダムな抽選がで値を持っているでしょうし、35 1E4の試みの左上隅には、このようなイベントを実現するのに十分ではないかもしれないという極めて低いであろうことを検討する必要がありHTH

+0

私は 'C(100、100)、C(100、100)'として周辺分布を維持したいと思います。私はあなたのソリューションがこれをどのように達成しているかは分かりません。 – paljenczy

+0

@paljenczy私の解決策は確かにそれを達成しません。しかし、あなたの質問にその要件を指定しなかったので、私は知ることができませんでした;-) – Jaap

+0

どのようにそれを達成するためのアイデア? – paljenczy

2

。 (今朝Rhelpリスト上のP. Dalgaardのが礼儀。)理論的な予測を見てください:

round(dhyper(0:100,100,100,100)*1e4) 
    [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
[18] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
[35] 0 0 0 1 4 9 21 45 88 160 269 417 596 787 959 1081 1124 
[52] 1081 959 787 596 417 269 160 88 45 21 9 4 1 0 0 0 0 
[69] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
[86] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

あなたが増加した場合の数が1の単一の値の確率を描くことは「広げる」:

vec.vals <- vapply(matrices, function(x) x[1, 1], numeric(1)); table(vec.vals) 
vec.vals 
    33  34  35  36  37  38  39  40  41  42  43  44  45 
    1  3  8  47 141 359 864 2148 4515 8946 15928 27013 41736 
    46  47  48  49  50  51  52  53  54  55  56  57  58 
59558 78717 96153 108322 112524 107585 96042 78054 60019 41556 26848 16134 8627 
    59  60  61  62  63  64  65  66  68 
    4580 2092 933 351 138  42  11  4  1 

...予想通り:

round(dhyper(0:100,100,100,100)*1e6) 
    [1]  0  0  0  0  0  0  0  0  0  0  0  0 
[13]  0  0  0  0  0  0  0  0  0  0  0  0 
[25]  0  0  0  0  0  0  0  0  0  1  4  13 
[37]  43 129 355 897 2087 4469 8819 16045 26927 41700 59614 78694 
[49] 95943 108050 112416 108050 95943 78694 59614 41700 26927 16045 8819 4469 
[61] 2087 897 355 129  43  13  4  1  0  0  0  0 
[73]  0  0  0  0  0  0  0  0  0  0  0  0 
[85]  0  0  0  0  0  0  0  0  0  0  0  0 
[97]  0  0  0  0  0 
関連する問題