2016-05-18 1 views
2

Я использую функцию r2dtable R для генерации таблиц непредвиденных ситуаций с заданными маргиналами. Однако при проверке полученных таблиц значения выглядят несколько слишком концентрированными до средних точек. Пример:Таблицы непредвиденных ситуаций r2dtable слишком сосредоточены

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, а максимальное - 62 из 10 000 симуляций.

Есть ли способ получить несколько менее концентрированные матрицы?

ответ

1

Чтобы получить менее концентрированные матрицы, вам нужно будет найти баланс между количеством столбцов/строк, итоговыми значениями и количеством матриц. Рассмотрим следующие наборы:

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

, который дает различия в ряде уникальных значений:

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

черчения это с:

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

дает:

enter image description here

Теперь рассмотрим:

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

, который дает:

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

черчения это с:

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

дает:

enter image description here

Как вам может видеть, игра с параметрами помогает.

НТН

+0

Я хотел бы сохранить маргиналов как 'C (100, 100), с (100, 100)'. Я не вижу, как ваше решение достигает этого. – paljenczy

+0

@paljenczy Мое решение действительно этого не достигает. Но поскольку вы не указали это требование в своем вопросе, я не мог знать ;-) – Jaap

+0

Любые идеи о том, как достичь этого? – paljenczy

2

Вы должны учитывать, что было бы крайне маловероятно, что любой случайный розыгрыш будет иметь значение с и верхним левым углом 35. попыток 1E4 не может быть достаточно, чтобы реализовать такое событие. Посмотрите на теоретические предсказания (любезность P. Dalgaard в списке Rhelp утром.):

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 
Смежные вопросы