Соответствующие элементы в списке - PullRequest
1 голос
/ 15 февраля 2012

Просто начинаю программировать на R ... На этот раз запутался, возможно, потому что я не знаю, с чего начать.

Определите случайную переменную, равную количеству испытаний до совпадения. Итак, если у вас есть список чисел (4,5,7,11,3,11,12,8,8,1 ....), первое значение случайной величины равно 6, потому что к тому времени есть два 11-е. (4,5,7,11,3,11) Второе значение - 3, потому что тогда у вас есть 2 8-х ..12,8,8. Приведенный ниже код создает список чисел u путем симуляции из равномерного распределения.

Спасибо за любую помощь или указатели. Я включил полное описание проблемы, которую я решаю, ниже, если кому-то интересно (пытаясь узнать, кодируя текст статистики).

set.seed(1); u = matrix(runif(1000), nrow=1000)
u[u > 0    & u <= 1/12]   <- 1
u[u > 1/12 & u <= 2/12]   <- 2
u[u > 2/12 & u <= 3/12]   <- 3
u[u > 3/12 & u <= 4/12]   <- 4
u[u > 4/12 & u <= 5/12]   <- 5
u[u > 5/12 & u <= 6/12]   <- 6
u[u > 6/12 & u <= 7/12]   <- 7
u[u > 7/12 & u <= 8/12]   <- 8
u[u > 8/12 & u <= 9/12]   <- 9
u[u > 9/12 & u <= 10/12]  <- 10
u[u > 10/12 & u <= 11/12] <- 11
u[u > 11/12 & u < 12/12] <- 12
table(u); u[1:10,]

Пример 2.6-3. Концепции вероятности и стохастического моделирования, Хиггинс Предположим, мы случайно спросили людей, в каком месяце они родились. Пусть случайная величина X обозначает количество людей, которых нам нужно будет спросить, прежде чем мы найдем двух человек, родившихся в одном месяце. Возможные значения для X 2,3, ... 13. То есть, чтобы иметь матч, нужно опросить не менее двух человек, а не более 13. С упрощающим предположением, что каждый месяц является одинаково вероятным кандидатом для ответа, компьютерное моделирование использовалось для оценки вероятностной функции массы X. Моделирование генерировало месяцы рождения, пока не было найдено совпадение. На основании 1000 повторений этого эксперимента были получены следующие эмпирические распределения и выборочная статистика ...

1 Ответ

4 голосов
/ 15 февраля 2012

R имеет крутую начальную кривую обучения. Я не думаю, что будет справедливо предполагать, что это ваша домашняя работа, и да, можно найти решения, если вы знаете, что ищете. Однако я помню, как иногда было трудно исследовать проблемы в Интернете просто потому, что я не знал, что искать (я не был достаточно знаком с терминологией).

Ниже приводится объяснение одного подхода к решению проблемы в R. Прочитайте закомментированный код и попробуйте выяснить, что именно он делает. Тем не менее, я бы порекомендовал работать через хороший ресурс для начинающих. По памяти неплохо было бы запустить и запустить icebreakeR , но их там много ...

# set the number of simulations
nsim <- 10000

# Create a matrix, with nsim columns, and fill it with something. 
#  The something with which you'll populate it is a random sample, 
#  with replacement, of month names (held in a built-in vector called
#  'month.abb'). We're telling the sample function that it should take 
#  13*nsim samples, and these will be used to fill the matrix, which 
#  has nsim columns (and hence 13 rows). We've chosen to take samples 
#  of length 13, because as your textbook states, 13 is the maximum
#  number of month names necessary for a month name to be duplicated.
mat <- matrix(sample(month.abb, 13*nsim, replace=TRUE), ncol=nsim)

# If you like, take a look at the first 10 columns
mat[, 1:10]

# We want to find the position of the first duplicated value for each column. 
#  Here's one way to do this, but it might be a bit confusing if you're just 
#  starting out. The 'apply' family of functions is very useful for
#  repeatedly applying a function to columns/rows/elements of an object.
#  Here, 'apply(mat, 2, foo)' means that for each column (2 represents columns,
#  1 would apply to rows, and 1:2 would apply to every cell), do 'foo' to that
#  column. Our function below extends this a little with a custom function. It
#  says: for each column of mat in turn, call that column 'x' and perform 
#  'match(1, duplicated(x))'. This match function will return the position
#  of the first '1' in the vector 'duplicated(x)'. The vector 'duplicated(x)'
#  is a logical (boolean) vector that indicates, for each element of x,
#  whether that element has already occurred earlier in the vector (i.e. if 
#  the month name has already occurred earlier in x, the corresponding element
#  of duplicated(x) will be TRUE (which equals 1), else it will be false (0).
#  So the match function returns the position of the first duplicated month 
#  name (well, actually the second instance of that month name). e.g. if 
#  x consists of 'Jan', 'Feb', 'Jan', 'Mar', then duplicated(x) will be 
#  FALSE, FALSE, TRUE, FALSE, and match(1, duplicated(x)) will return 3. 
#  Referring back to your textbook problem, this is x, a realisation of the 
#  random variable X.
# Because we've used the apply function, the object 'res' will end up with
#  nsim realisations of X, and these can be plotted as a histogram.
res <- apply(mat, 2, function(x) match(1, duplicated(x)))
hist(res, breaks=seq(0.5, 13.5, 1))

Histogram of results

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