Выборка из столбцов ys, сложенных по значениям x в R (предоставляется визуальное представление)

Фон

У меня есть две переменные с именами x и y (см. код R под картинкой). Когда я plot(x, y), я получаю график верхней строки (см. ниже). y значения располагаются поверх каждого x значения.

Вопрос

Мне интересно, ПОЧЕМУ, когда я выбираю из значений y, которые отдельно сложены поверх каждого значения x (например, значения y, сложенные поверх значения x, равного 0), я получаю некоторые выборочные значения y, которые находятся за пределами их диапазона. образец их матери!? (чтобы увидеть это, см. таблицу в нижней строке).

введите здесь описание изображения

ВОТ МОЙ КОД R:

 #############  Input Values ###################
                      each.sub.pop.n = 150; 
                      sub.pop.means = 20:10; 
                      predict.range = 0:10; 
                      sub.pop.sd = .75;
                      n.sample = 2;
 #############################################
  par( mar = c(2, 4.1, 2.1, 2.1) )

  m = matrix( c(1, 2), nrow = 2, ncol = 1 ); layout(m)

  Vec.rnorm <- Vectorize(function(n, mean, sd) rnorm(n, mean, sd), 'mean')

  y <- c( Vec.rnorm(each.sub.pop.n, sub.pop.means, sub.pop.sd) )

  x <- rep(predict.range, each = each.sub.pop.n)

  plot(x, y)


  ## Unsuccessfull Sampling ##
  x <- rep(predict.range, each = n.sample)

  y <- sample(y , length(x), replace = TRUE)

  plot(x, y)

person rnorouzian    schedule 16.05.2017    source источник


Ответы (2)


Мне кажется, что ваша выборка не обусловлена ​​x в вашей неудачной выборке. Ниже я разделил данные y на x, а затем выбрал два случая из каждого. Результат вроде работает.

sample <- lapply(split(y, x), function(z) sample(z, n.sample, replace = TRUE))
sample <- data.frame(y = unlist(sample), 
                     x = as.numeric(rep(names(sample), each = n.sample)))
plot(sample$x, sample$y)

введите здесь описание изображения

person Daniel Anderson    schedule 16.05.2017
comment
Я на самом деле думаю, что это просто исходит из части y <- sample(y , length(x), replace = TRUE), потому что вы выбираете length(x) или 20 значений из всего вектора y с заменой, а не выбираете условно по x (т. е. в каждом слое). Надеюсь, это поможет. - person Daniel Anderson; 17.05.2017
comment
Однако на самом деле, если бы вы сохранили его как матрицу, вы могли бы сэмплировать с помощью функции применения, перебирая столбцы. Что-то вроде apply(y, 2, function(x) sample(x, n.sample, replace = TRUE)). - person Daniel Anderson; 17.05.2017
comment
Даниил, что-то не так! изменить predict.range = 0:10; до predict.range = 10:0`, и вы увидите, что семпл идет в обратном направлении! - person rnorouzian; 17.05.2017
comment
У меня была ошибка в том, как я определял переменную x в примере фрейма данных. Проверьте редактирование. - person Daniel Anderson; 17.05.2017

Вы можете использовать стратифицированную выборку, реализованную в пакете sampling с функцией strata:

  par( mar = c(2, 4.1, 2.1, 2.1) )
  m = matrix( c(1, 2), nrow = 2, ncol = 1 ); layout(m)
  Vec.rnorm <- Vectorize(function(n, mean, sd) rnorm(n, mean, sd), 'mean')
  y <- c( Vec.rnorm(each.sub.pop.n, sub.pop.means, sub.pop.sd) )
  x <- rep(predict.range, each = each.sub.pop.n)
  plot(x, y)

  library(sampling)
  df <- data.frame(x,y)
  set.seed(123)
  stratif_sampl <- strata(df,"x",rep(2,11))
  idx <- stratif_sampl$ID_unit
  plot(x[idx], y[idx])

введите здесь описание изображения

person Marco Sandri    schedule 16.05.2017