Как мне создать случайную таблицу непредвиденных обстоятельств в R? - PullRequest
0 голосов
/ 04 августа 2011

Я хотел бы создать случайные двусторонние таблицы сопряженности с заданными фиксированными маргинальными строками и столбцами. Предположим, у меня есть такая таблица:

      A   C   G   T
  A  79   6  13  53
  C  16   7   6  17
  G   9   3   1   6
  T  58  28  18 114

с заданными маргинальными строками:

  A   C   G   T 
151  46  19 218 

и поля столбцов:

  A   C   G   T 
162  44  38 190 

Я хотел бы создать таблицу случайных ситуаций, например:

   A  C  G  T
A 49 16 10 76
C 23  2  6 15
G 11  0  1  7
T 79 26 21 92

, который сохраняет эти маргиналы.

Поскольку в этом случае n не слишком велико, я попытался приблизиться к этому, "разомкнув" маргинальные векторы, т. Е. Преобразовав маргиналы в векторы вида

A A A ...C C C ... G G G ... T T T 

, а затем переставлять и складывать их.

Мой нынешний метод «развязывания» маргиналов весьма неестественный и неэффективный, и мне было любопытно узнать, есть ли лучший способ. Некоторые встроенные функции должны создавать случайные таблицы на случай непредвиденных обстоятельств, например, chisq.test когда simulate.p.value = TRUE. Встроено ли построение таблицы случайных ситуаций?

Заранее спасибо за любые предложения.

Ответы [ 2 ]

3 голосов
/ 31 марта 2015

Извините, но ответ @ joran неверен. Его формула правильно моделирует таблицы с правильными итоговыми значениями столбцов, но ОП запросил моделирование, которое учитывает итоговые значения как строк, так и столбцов. Решение этой проблемы было дано в 1981 году В.М. Patefield. Алгоритм AS159. Эффективный метод генерации r x c таблиц с учетом итогов по строкам и столбцам . Прикладная статистика, 30. 91-97.

Алгоритм Пейтфилда реализован в функции Base R r2dtable ().

3 голосов
/ 05 августа 2011

Я не совсем уверен, что вы подразумеваете под «снятием метки», и, поскольку вы на самом деле не указали метод, который используете в данный момент, я не могу быть уверен, что это не то, что вы делаете в данный момент. .

Но, учитывая маргиналы (162, 44, 38, 190), вы можете «воссоздать» вектор, просто выполнив следующее:

rep(c('A','C','G','T'),times = c(162, 44, 38, 190))

, который затем можно переставлять по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...