Случайная подвыборка в R

Я новичок в R, поэтому мой вопрос может быть очень простым. У меня есть 40 участков с обилием зоопланктона.

Мои данные выглядят так (столбцы — численность видов, а строки — сайты)

0   0   0   0   0   2   0   0   0   
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   85  0
0   0   0   0   0   45  5   57  0
0   0   0   0   0   13  0   3   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   7   0
0   3   0   0   12  8   0   57  0
0   0   0   0   0   0   0   1   0
0   0   0   0   0   59  0   0   0
0   0   0   0   4   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   105 0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0
0   0   0   0   1   0   0   100 0
0   35  0   55  0   0   0   0   0
1   4   0   0   0   0   0   0   0
0   0   0   0   0   34  21  0   0
0   0   0   0   0   9   17  0   0
0   54  0   0   0   27  5   0   0
0   1   0   0   0   1   0   0   0
0   17  0   0   0   54  3   0   0

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


person Paris St    schedule 22.08.2013    source источник
comment
Вы уверены, что хотите обойтись без замещающей выборки? Большинство бутстрапов индекса разнообразия, с которыми я знаком, используют С замещающей выборкой.   -  person Dinre    schedule 22.08.2013
comment
Как насчет пустого (нулевого) изобилия? Просьба уточнить. Какова вселенная каждого сайта? Предполагается ли его стратификация по видам?   -  person Ferdinand.kraft    schedule 22.08.2013


Ответы (4)


Попробуйте что-то вроде этого:

mysample <- mydata[sample(1:nrow(mydata), 50, replace=FALSE),]
person andreister    schedule 22.08.2013
comment
ОП запросил выбрать 50 элементов с каждого сайта. Этот код (mydata[sample(1:nrow(mydata), 50, replace=FALSE),]) вместо этого выбирает 50 сайтов. - person Dinre; 22.08.2013

То, что ОП, вероятно, ищет здесь, - это способ загрузки данных для индекса разнообразия Хилла или Симпсона, который дает некоторые предположения о выборке данных:

  • Каждая строка — это сайт, каждый столбец — вид, а каждое значение — счет.
  • Для начальной загрузки отбираются отдельные лица, а НЕ ПОДСЧЕТ.

Для этого программы начальной загрузки часто моделируют счетчики как строку отдельных лиц. Например, если бы у нас была такая запись:

a  b  c
2  3  4

Запись будет смоделирована как:

aabbbcccc

Затем обычно берется образец с заменой из строки, чтобы создать больший набор на основе набора моделей.

Загрузка сайта: в R у нас есть способ сделать это, который на самом деле довольно прост с помощью функции «образец». Если вы выбираете из номеров столбцов, вы можете указать вероятности, используя данные подсчета.

# Test data.
data <- data.frame(a=2, b=3, c=4)

# Sampling from first row of data.
row <- 1
N_samples <- 50

samples <- sample(1:ncol(data), N_samples, rep=TRUE, prob=data[row,])

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

# Count the number of each entry and store in a list.
for (i in 1:ncol(data)){
    site_sample[[i]] <- sum(samples==i)
}

# Unlist the data to get an array that represents the bootstrap row.
site_sample <- unlist(site_sample)
person Dinre    schedule 22.08.2013
comment
Большое спасибо за ваш быстрый ответ (к сожалению, я не могу сказать то же самое о себе!). Можете ли вы сказать мне, что означает site_sample? Кроме того, я думаю, что могу изменить количество N_samples, если я хочу иметь большую подвыборку (например, 100) с каждого сайта. - person Paris St; 20.10.2013
comment
В этом примере site_sample — это массив, в котором перечислены счетчики для каждого столбца, точно так же, как ваши исходные данные отформатированы, но представляют собой начальную загрузку. Он представляет собой одну строку. И да, изменение N_samples приведет к загрузке другого количества сэмплов. - person Dinre; 01.11.2013

Только что наткнулся на эту тему, и в веганском пакете есть функция под названием «rarify», которая делает именно то, что вы хотите сделать (и в том же экологическом контексте).

person RPK    schedule 11.11.2015
comment
Я не смог найти «rrarefy», вы имеете в виду функцию «rarefy» в веганском языке? - person magda_wu; 01.05.2019
comment
Хорошо, я нашел это: github.com/vegandevs/vegan/blob/ master/R/rrefy.R - person magda_wu; 02.05.2019

Это должно работать. Это немного сложнее, чем кажется на первый взгляд, поскольку каждая ячейка содержит количество видов. Решение использует функцию apply для отправки каждой строки данных в определяемую пользователем функцию sample_species. Затем мы генерируем n случайных чисел и упорядочиваем их. Если имеется 15 видов 1, 20 видов 2 и 20 видов 3, случайные числа, сгенерированные между 1 и 15, означают вид 1, 16 и 35 означают вид 2, а 36-55 означают вид 3.

## Initially takes in a row of the data and the number of samples to take
sample_species <- function(counts,n) {
  num_species <- length(counts)
  total_count <- sum(counts)
  samples <- sample(1:total_count,n,replace=FALSE)
  samples <- samples[order(samples)]
  result <- array(0,num_species)
  total <- 0
  for (i in 1:num_species) {
    result[i] <- length(which(samples > total & samples <= total+counts[i]))
    total <- total+counts[i]
  }
  return(result)
}

A <- matrix(sample(0:100,10*40,replace=T), ncol=10) ## mock data
B <- t(apply(A,1,sample_species,50)) ## results
person thompsor    schedule 22.08.2013
comment
Спасибо за ваш ответ. Единственное, чего я не понимаю, так это куда девать свои данные. Итак, если у меня есть фрейм данных под названием Zoop (40obs x 22var), где 40 — сайты, а 22 — виды, чтобы получить подвыборку из 50 особей с каждого сайта, будет ли это: A‹-matrix(sample(0:100 ,22:40,заменить=T),ncol=22). Часть 1:100 должна быть неправильной, я полагаю? Спасибо за вашу помощь - person Paris St; 20.10.2013
comment
Ваши данные должны быть в матрице A. То, что я сделал выше, это просто генерация случайных данных в A с 0-100 численностью на пару местоположений/видов (с 40 участками и 10 видами). Чтобы использовать функцию sample_species, вы должны просто вызвать строку B ‹- t(apply(A,1,sample_species,50)) где A — ваша существующая матрица данных или фрейм данных. - person thompsor; 15.11.2013