Модель урны в R (попытка рассчитать вероятности случайных событий)

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

Состав урны (красные и черные шары) задается вектором a ‹-c(число_красное, число_черное)

Случайное событие указывается в другом векторе, скажем, b‹-c("красный","красный","черный","красный") или любая другая комбинация красных и черных шаров

Теперь нужно вычислить вероятность события (вектор b), когда шары 1) заменены в урне, и порядок имеет значение 2) НЕ заменен в урне, и порядок имеет значение 3) НЕ заменен в урне, и порядок не имеет значения 4) заменяется в урне, и порядок не имеет значения

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

stan = function(n,x) {return(n^x)}
perm = function(n, x) {return(factorial(n) / factorial(n-x))}
komb = function(n, x) {return(factorial(n) / (factorial(n-x)*factorial(x)))}
komb2 = function(n, x) {return(factorial(n+x-1) / (factorial(n-1)*factorial(x)))}

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

Я также экспериментировал с циклами for, чтобы эмулировать древовидную диаграмму, но это стало для меня слишком сложным. Например:

c <- c(number_red/(number_red+number_black), number_red/(number_red+number_black))
b <- c("red","black","red")
b[b=="red"]<-1
[b=="black"]<-2
b<-as.numeric(b)

vec<-NULL

for (i in b){
vec<-c(vec, c[i])}

prod(vec)

Подобное решение дает правильные результаты для задачи № 1, но я действительно не знаю, как применить его к другим проблемам, поскольку мне нужно будет найти способ изменить вектор c в соответствии с составом вектора b каждый раз, когда я запускаю цикл .

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

Лучший, Генри


person Enrico del Piero    schedule 20.11.2016    source источник
comment
во втором блоке кода c — это доля мячей, а в вашем тексте c — количество мячей, не могли бы вы пояснить это? и c также является именем внутренней функции, вам лучше выбрать другие имена.   -  person mt1022    schedule 20.11.2016
comment
Я использовал пропорции, потому что они представляют вероятности вытащить один шар. Таким образом, каждый раз, когда выполняется цикл, к vec добавляется либо вероятность вытянуть красный, либо черный шар в соответствии с комбинацией b. В конце все отдельные вероятности перемножаются, чтобы получить общую вероятность b. Извините, я не был ясно об этом   -  person Enrico del Piero    schedule 20.11.2016


Ответы (1)


Это верно?

a <- c(red = 5, black = 5)
b <- c("red","red","black","red")


# (1)
prod((a/sum(a))[b])

# (2)
p <- c()
n <- a
for(i in b){
    p <- c(n[i] / sum(n), p)
    n[i] <- n[i] - 1
}
prod(p)

# (3)
komb <- function(n, x) {
    return(factorial(n) / (factorial(n-x)*factorial(x)))
}

n <- table(b)

prod(sapply(names(n), function(i){
    komb(a[i], n[i])
})) / komb(sum(a), sum(n))

# (4)
# I think it is the same as (1) as each sample is independent;
person mt1022    schedule 20.11.2016
comment
Большое спасибо. Очень полезно. Решения для № 1, 2 и 3 кажутся мне правильными. Однако № 4 не совпадает с № 1, поскольку порядок вытягивания шаров не имеет значения. Значит вероятность события должна быть выше, чем в сценарии №1. Я думаю, что один из способов вычислить это — умножить результат № 1 на количество возможных аранжировок или порядков b. В нашем примере есть 4 различных возможных расположения (я их посчитал)... Но как я могу вычислить количество возможных расположений, если be меняется? Я ищу абстрактное решение. - person Enrico del Piero; 22.11.2016
comment
один тонкий момент, который я пробовал, это, но он не дает правильного результата (и, вероятно, очень неправильно, так как я пытался изменить решение задачи № 3) komb2 = function(n, x) {return(factorial(n+x- 1) / (factorial(n-1)*factorial(x)))} n ‹- table(b) prod( sapply(names(n), function(i){ komb2(a[i], n[i] ) }) )/ комб2(сумма(а), сумма(п)) - person Enrico del Piero; 22.11.2016
comment
Поверьте, это то же самое, что и 1. - person mt1022; 22.11.2016