Нормально ли, что set.seed() внутри цикла приводит к дубликатам?

#r #data.table #subset #resampling #random-seed

Вопрос:

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

 #strata variable
a1 <- c(1,1,1,2,2,2,2,2,3,3,3,4,5,5,5,5,5,5,6,6,7,7,7,7)
set.seed(9292)
#some values
a2 <- rnorm(24)

xdt <- as.data.table(cbind(a1, a2))
#total possibilities
prod(xdt[,.N,by=a1]$N)


idlist <- list()
for(i in 1:1000){
  set.seed(i)
  xdt2 <- xdt[, .SD[sample(.N, min(1,.N))], by = a1]
  #return the index
  idlist[[i]] <- which(xdt$a2%in%xdt2$a2)
}


#create a tabular format of the indices
#each row of the table is to be used to subset datasets for analysis 
idlist <- matrix(unlist(idlist), nrow = 7)
idlist <- t(idlist)
idlist <- as.data.table(idlist)
idlist <- unique(idlist)

 

Когда выбирается одна строка для каждого слоя, можно извлечь примерно 2000 различных подмножеств. Когда я запускаю приведенный выше код, я обнаруживаю, что некоторые строки удаляются с unique помощью команды. Это нормально, потому что конечный результат пока кажется идентичным. Я могу просто увеличить общее количество итераций до более чем 1000, если хочу получить 1000 уникальных индексов. Однако мне было интересно, нормально ли это? Если set.seed меняется на каждой итерации, разве не должно быть совершенно уникальных возможностей все время, особенно когда есть так много общих возможностей (2160, что в данном случае почти вдвое больше)?

Или я совершаю ошибку, которая для меня не очевидна?

Комментарии:

1. Случайный-это не то же самое, что гарантированный-уникальный. С или без set.seed , у вас есть ненулевое изменение дубликатов.

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

3. @r2evans спасибо! Это кое-что прояснило для меня. @dcarlson Да, именно этим я и занимался. Просто хотел прояснить это сомнение относительно set.seed

Ответ №1:

Как поясняется в комментариях. Использование set.seed не гарантирует случайности.