Frage

habe ich einen Datensatz, der eine Liste der Arten gehören, ihre Grafen und die Tageszählung aus, wenn die Befragung begann. Seit vielen Tagen nicht abgetastet wurden, ist Tag nicht kontinuierlich. So zum Beispiel, könnte es Vögel am Tag gezählt seine 5,6,9,10,15,34,39 und so weiter. Ich habe das früheste Datum, 0 Tage sein.

Beispieldaten:

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

Ich brauche diese Daten, um Bootstrap und eine resultierende Datenmenge zu bekommen, wo ich angeben, wann wir anfangen, was Intervall in und die Anzahl der Punkte auf Probe, um fortzufahren.

Beispiel: Sagen wir, ich wählen zufällig Tag 5 als Starttag, das Intervall als 30, und die Anzahl der Zeilen Probe als 2. Es bedeutet, dass ich bei 5 starten, fügen Sie 30 hinzu und sucht zwei Reihen um 35 Tage (aber nicht Tag 35 selbst). In diesem Fall werde ich die zwei Reihen greifen, wo Tag 34 und 39.

Als nächstes füge ich 30 bis 35 und sucht zwei Punkte um 65 Spülen, wiederholen, bis ich an das Ende des Datensatzes erhalten.

Ich habe diese Funktion geschrieben, um die Probenahme zu tun, aber es hat Fehler (siehe unten):

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

Zwei Fragen, die ich brauche Hilfe mit:

  1. Während meine Funktion, um die gewünschte Anzahl von Punkten zurückkehrt, wird es nicht um meinen Suchwert zentriert. Das macht Sinn, weil, wie ich weiter, ich mehr Punkte zu bekommen und wenn ich sortieren diese und die erste n wählen, Sie neigen dazu, nicht die niedrigen Werte zu sein.

  2. Zweitens, wie bekomme ich die tatsächlichen Zeilen aus? Denn jetzt habe ich eine andere Funktion diese Zeilen mit which ausfindig zu machen, dann rbind ‚zusammen den Zeilen ing. Scheint, wie sollte es einen besseren Weg geben.

Danke!

War es hilfreich?

Lösung

Wie wäre es etwa wie folgt:

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]

Um die Zeilen aus data.frame bekommt es nur Teilmenge:

rows = data[pos, ]

Das ist vielleicht etwas sauberer als die fehlenden oder / lapply / f Combo:

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

Beachten Sie auch, dass, wenn Sie ein größeres Fenster wollen (zB 4 sagen), es ist nur eine Frage der geht ein wenig zurück:

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

Andere Tipps

Liebte die Lösung von Charles, die sich perfekt für den Fall funktioniert n = 2. Ach, es ist nicht erweiterbar auf größere Fenster. Es hat immer noch das Problem, indem OP beschrieben: mit größeren Fenstern, wird die Auswahl nicht um den Suchwert zentriert. Gegeben n gerade ist, kam ich mit folgenden Lösung auf, stark auf Charles Idee.

Die Funktion steuert die Grenzen. wenn es 100 Tage sind, und der nächste Mittelpunkt ist der zweitletzte Tag sagen, ein Fenster von 4 würde bedeuten, dass Sie Index 101, wählen Sie die NA gibt. Diese Funktion verschiebt das Fenster, so dass alle ausgewählten Indizes innerhalb der ursprünglichen Daten liegen. Dies hat auch den Nebeneffekt, dass die auf den Werten des Starts abhängig (st), Länge (l) und Fenster (n) Werte der Anfang und das Ende haben eine höhere Wahrscheinlichkeit von zweimal ausgewählt worden ist. Die Längen sollten immer mindestens zweimal die Fenstergröße.

Die Ausgabe der Funktion sind die Indizes der Bootstrap-Probe. Es kann als die pos Variable von Charles auf Vektoren und Datenrahmen verwendet werden.

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

Dann

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

edit: in Bezug auf Bootstrapping für Zeitreihen, sollten Sie durch die gehen CRAN taskview auf Zeitreihe , insbesondere den Abschnitt über Resampling. Für unregelmäßige Zeitreihe, das zoo Paket bietet auch ganz einige andere Funktionen, die nützlich sein können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top