Программирование на R: функция sample () возвращает повторяющиеся объекты, даже если replace = TRUE

Я использую функцию sample () для получения случайной выборки из объекта игральных костей.

> die
[1] 1 2 3 4 5 6
> sample(x=die , size=1 , replace=TRUE)
[1] 1
> sample(x=die , size=1 , replace=TRUE)
[1] 1
> sample(x=die , size=1 , replace=TRUE)
[1] 5
> sample(x=die , size=1 , replace=TRUE)
[1] 5
> sample(x=die , size=1 , replace=TRUE)
[1] 1
> sample(x=die , size=1 , replace=TRUE)
[1] 2
> sample(x=die , size=1 , replace=TRUE)
[1] 4

Если вы наблюдаете выше, вывод 1 повторяется 3 раза и 5 повторяется 2 раза. Но из приведенного выше вывода даже замените TRUE, я мог видеть частые множественные дублирования.

Ссылка: я читаю книгу под названием Практическое программирование с помощью R.

Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

Спасибо.


person rɑːdʒɑ    schedule 02.09.2016    source источник


Ответы (3)


Это не статистический, а программный вопрос, и он лучше подходит для Stack Overflow.

Вы неправильно используете sample(), если ваша цель - избежать получения одного и того же числа дважды. Чтобы избежать повторений, вам нужно создать образец с помощью одной команды (size больше 1 вместо нескольких команд) и с использованием replace=FALSE (не TRUE). Например:

> sample(x=die , size=4 , replace=FALSE)
[1] 1 6 4 3

Конечно, это больше не соответствует множеству справедливых бросков кубиков, так как настоящие кубики могут дать вам то же самое число в последующих бросках.

См. Страницу справки ?sample для получения полной информации о том, как использовать sample().

person Rob Hall    schedule 02.09.2016

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

Аргумент replace= вообще не действует, когда size=1, например, после того, как вы вытащили одну сторону игральной кости, не имеет значения, замените вы ее или нет. replace=FALSE предотвратит дублирование в одном вызове sample(). Это не повлияет на следующий вызов sample.

person Bernhard    schedule 02.09.2016
comment
И случайно ли он сделал это 7 раз, что с шестигранной костью ............ - person ; 02.09.2016

Sample () не влияет на последующие запуски sample () для того же вектора. Что вам нужно, так это функция, которая постепенно удаляет ваши фотографии из вектора, который вы анализируете. Здесь я написал что-то подобное, названное rsample (), которое возвращает взятый объект и новый вектор, лишенный выбранного объекта.

rsample<-function(x){
    taken<-sample(x,size=1)
    newx<-x[-which(x==taken)[1]]
    return(list(taken=taken,new=newx))
}
die<-1:6
obj<-rsample(die)
obj$taken
[1] 3
obj<-rsample(obj$new)
obj$taken
[1] 5
obj<-rsample(obj$new)
obj$taken
[1] 2
obj<-rsample(obj$new)
obj$taken
[1] 4
obj<-rsample(obj$new)
obj$taken
[1] 1
person Federico Giorgi    schedule 02.09.2016
comment
Может быть, мы можем использовать это, чтобы избежать дублирования элементов в одномерных векторных данных вместе с функцией sample () в качестве длины вектора в качестве условного значения. - person rɑːdʒɑ; 02.09.2016
comment
Нет, 1-D + Sample (), но без повторений до выборок длины вектора. Надеюсь, вы понимаете. - person rɑːdʒɑ; 02.09.2016
comment
@Raja Разве это не проще сделать с replicate = FALSE? - person Bernhard; 02.09.2016
comment
@Raja sample(1:n, size=n, replace=FALSE) никогда не будет иметь повторений в возвращаемых значениях. - person Bernhard; 02.09.2016
comment
Функция Федерико Джорджи позволит вам вызывать эту функцию несколько раз, но, вероятно, гораздо быстрее будет один раз вызвать sample, чем повторно вызвать rsample Федерико Джорджи. В редких случаях может быть лучше использовать это, но обычно: просто возьмите большой sample и используйте его понемногу. - person Bernhard; 02.09.2016
comment
Разве не было бы проще позвонить sample(die, 6, replace = FALSE)? - person catastrophic-failure; 02.09.2016