Как обрабатывать значения N случайным, ближайшим к значению Y, когда данные не являются непрерывными?

StackOverflow https://stackoverflow.com/questions/3950877

Вопрос

У меня есть набор данных, который включает в себя список видов, их количество, и день, от того, когда начался опрос. Много дней не было выбранным, день не является непрерывным. Так, например, могут быть засчитаны птицы на день 5,6,9,10,15,34,39 и так далее. Я устанавливаю самое раннее свидание 0.

Пример данных:

species     counts      day
Blue tit    234         0
Blue tit    24          5
Blue tit    45          6
Blue tit    32          9
Blue tit    6           10
Blue tit    98          15
Blue tit    40          34
Blue tit    57          39
Blue tit    81          43
..................

Мне нужно загрузить эти данные и получить полученный набор данных, где я указываю, когда начать, какой интервал для продолжения и количества точек на выборку.

Пример: скажем, я скажу, что вы выберете день 5 в качестве дня начала, интервал как 30, а количество строк к образцу как 2. Это означает, что я начну с 5, добавьте 30 к нему и ищу 2 строк около 35 дней (но не самый день 35 сам). В этом случае я возмужу два ряда, где день 34 и 39.

Далее я добавляю от 30 до 35 и ищите два очка около 65. Промыть, повторите, пока не доберусь до конца набора данных.

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

resample <- function(x, ...) x[sample.int(length(x), ...)]
 locate_points<- function(dataz,l,n) #l is the interval, n is # points to sample. This is called by another function that specifies start time among other info.
{
   tlength=0
   i=1
    while(tlength<n)   
    {
        low=l-i
        high=l+i
        if(low<=min(dataz$day)) { low=min(dataz$day) }
        if(high>=max(dataz$day)) { high=max(dataz$day) }
        test=resample(dataz$day[dataz$day>low & dataz$day<high & dataz$day!=l])
          tlength=length(test)
         i=i+1
      } 
  test=sort(test)
  k=test[1:n]
 return (k)
 } 

Две проблемы, которые мне нужна помощь с:

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

  2. Во-вторых, как я могу получить фактические ряды? У меня есть еще одна функция, чтобы найти эти строки, используя which, тогда rbind на этих рядах вместе. Похоже, там должен быть лучший способ.

Спасибо!

Это было полезно?

Решение

Как насчет чего-то вроде следующее:

day = 1:1000

search = seq(from=5, to=max(day), by=30)
x = sort(setdiff(day, search))
pos = match(x[unlist(lapply(findInterval(search, x), seq, len=2))], day)

day[pos]

Чтобы заставить строки из ваших данных. Сделайте, просто поднимите его:

rows = data[pos, ]

Это, возможно, слегка очистите, чем Combo Unist / Lapply / Seq:

pos = match(x[outer(c(0, 1), findInterval(search, x), `+`)], day)

Также обратите внимание, что если вы хотите большее окно (например, сказать 4), это просто вопрос возвращения немного:

pos = match(x[outer(-1:2, findInterval(search, x), `+`)], day)

Другие советы

Любил решение Чарльза, который отлично работает для случая n = 2. Увы, это не расширяется для более крупных окон. Он все еще имеет проблему, описанную в OP: с более крупными Windows, выбор не сосредоточен вокруг значения поиска. Учитываясь даже, я придумал следующее решение, сильно основанное на Чарльзской идее.

Функция контролирует границы. Если есть 100 дней, и следующая средняя точка говорит, что второй последний день, окно 4 будет означать, что вы выбираете Index 101, который дает NA. Отказ Эта функция сдвигает окно, чтобы все выбранные индексы лежат в исходных данных. Это также имеет побочный эффект, который в зависимости от значений запуска (st), длина(l) и окно (n) Значения начала и конца имеют более высокий шанс быть выбран дважды. Длина всегда должна быть не менее удвоенного размера окна.

Выход функции являются индексами образца Bootstrap. Может использоваться как pos Переменная Чарльза на векторах и данных данных.

bboot <- function(day,st,l,n){
  mid <- seq(st,max(day),by=l)
  x <-sort(setdiff(day,mid))
  lx <- length(x)

  id <- sapply(mid,
          function(y){
            m <- match(T,x>y)
            seq(
              from=min( lx-n, max(1,m+(-n/2)) ),
              to=min( lx, max(n,m+(n/2-1)) )
            )
          }
        )

  pos <- match(x[id],day)
  return(pos)
}

потом

>   day <- sample(1:100,50)
> sample.rownr <- bboot(day,10,20,6)
> sort(day)
 [1]  3  4  5  7  9 10 13 15 16 18 19 21 22 24 25 26 27 28 29 
[20] 30 31 32 35 36 38 40 45 49 51 52 54 55 58 59 62 65 69 72 73
[40] 74 80 84 87 88 91 92 94 97 98 99
> day[sample.rownr]
 [1]  5  7  9 13 15 16 27 28 29 31 32 35 40 45 49 51 52 54 62 
[20] 65 69 72 73 74 84 87 88 91 92 94
> 

Редактировать: Что касается загрузки для временных рядов, вы должны пройти через Cran TaskView на временных рядах, Особенно раздел об перезахнинии. Для нерегулярных временных рядов, zoo Пакет также предлагает довольно некоторые другие функциональные возможности, которые могут пригодны.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top