¿Cómo me muestra n valores al azar más cercana a valor de y cuando los datos no son continuas?

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

Pregunta

Tengo un conjunto de datos que incluye una lista de las especies, su recuento y el recuento de días desde que comenzó la encuesta. Dado que muchos días no fueron muestreados, día no es continua. Así, por ejemplo, podría haber aves contadas en el día 5,6,9,10,15,34,39 y así sucesivamente. He establecido la fecha más próxima a ser el día 0.

Ejemplo datos:

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
..................

necesito para arrancar estos datos y obtener un conjunto de datos resultante, donde puedo especificar cuándo empezar, qué intervalo de proceder y el número de puntos a la muestra.

Ejemplo: Digamos que escoja al azar el día 5 como el día de inicio, el intervalo de un 30, y el número de filas que se muestra como 2. Esto significa que voy a empezar a los 5, 30 agregar a la misma, y ??el aspecto de 2 filas alrededor de 35 días (pero no el día 35 en sí). En este caso se agarra las dos filas donde día es 34 y 39.

A continuación añado 30 a 35 y el aspecto de dos puntos alrededor de 65. Enjuague, repita hasta que llegue a la final del conjunto de datos.

He escrito esta función para hacer el muestreo, pero tiene defectos (véase más adelante):

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)
 } 

Dos cuestiones que necesito ayuda con:

  1. Si bien mi función no devuelve el número deseado de puntos, no se centra en el valor de mi búsqueda. Tiene sentido porque como consigo más amplio, consigo más puntos y cuando los tipo y recoger los primeros n, Tienden a no ser los valores bajos.

  2. En segundo lugar, ¿cómo puedo obtener las filas reales a cabo? Por ahora tengo otra función para localizar estas filas usando which, entonces rbind 'ing esas filas juntos. Parece que debe haber una mejor manera.

Gracias!

¿Fue útil?

Solución

¿Qué tal algo como lo siguiente:

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]

Para obtener las filas de su hoja.de.datos solo subconjunto de él:

rows = data[pos, ]

Esta es tal vez un poco más limpio que el no listados / lapply / ss combinado:

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

También tenga en cuenta que si quieres una ventana más grande (por ejemplo, dicen 4), que es sólo una cuestión de ir un poco atrás:

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

Otros consejos

Loved la solución de Charles, que funciona perfectamente para el caso n = 2. Por desgracia, no es extensible a las ventanas más grandes. Todavía tiene el problema descrito por OP: con ventanas más grandes, la selección no se centra en el valor de búsqueda. Dado n es par, se me ocurrió una solución, en gran medida basado en la idea de Charles siguiente.

La función controla las fronteras. si hay 100 días, y el siguiente punto medio es decir el segundo día pasado, una ventana de 4 significaría que selecciona índice de 101, lo que da NA. Esta función desplaza la ventana para que todos los índices seleccionados se encuentran dentro de los datos originales. Esto también tiene el efecto secundario que, dependiendo de los valores de inicio (st), longitud (l) y la ventana (n) valores del inicio y el final tienen una mayor probabilidad de sido seleccionado dos veces. Las longitudes siempre deben ser al menos dos veces el tamaño de la ventana.

La salida de la función son los índices de la muestra bootstrap. Se puede utilizar como variable de pos de Charles sobre vectores y tramas de datos.

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)
}

Entonces

>   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
> 

editar: en relación con arranque de series de tiempo, usted debe ir a través de la CRAN en taskview series de tiempo, especialmente la sección sobre el nuevo muestreo. Para las series irregulares de tiempo, el paquete zoo también ofrece bastante algunas otras funcionalidades que pueden ser muy útiles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top