Identifizieren der maximalen Anzahl und längsten Anzahl von Zeitintervallen

9

Sagen Sie, ich habe Daten, die wie folgt aussehen:

%Vor%

oder das:

%Vor%

Sie erzeugen die folgenden Grafiken:

Wie Sie sehen können, gibt es mehrere Zeitintervalle auf verschiedenen Ebenen. Das Level-1-Intervall erstreckt sich immer über die gesamte Dauer der interessierenden Zeit. Level 2+ haben kürzere Zeitintervalle.

Was ich tun möchte, ist die maximale Anzahl nicht überlappender Zeitintervalle für jede Periode auszuwählen, die die maximale Anzahl der Gesamtzeit darin enthalten. Ich habe pink markiert, welche das sind.

Für kleine Datenrahmen ist es möglich, dies zu erzwingen, aber offensichtlich sollte es einen logischeren Weg geben, dies zu tun. Ich bin daran interessiert, einige Ideen zu hören, was ich ausprobieren sollte.

BEARBEITEN:

Ich denke, eine Sache, die hier helfen könnte, ist die Spalte "level". Die Ergebnisse stammen von Kleinbergs Burst-Detection-Algorithmus (Paket 'Bursts'). Sie werden feststellen, dass die Ebenen hierarchisch organisiert sind. Ebenen mit derselben Nummer können nicht überlappen. Stufen, die jedoch z. 2,3,4 in aufeinanderfolgenden Zeilen können sich überlappen.

Im Wesentlichen glaube ich, dass das Problem dadurch verkürzt werden könnte. Nehmen Sie die produzierten Level, aber entfernen Sie Level 1. Dies wäre der Vektor für das zweite Beispiel:

%Vor%

Dann schau dir die 2s an ... wenn es weniger als oder nur eine '3' gibt, dann ist das 2 das längste Intervall. Aber wenn zwei oder mehr 3 zwischen aufeinanderfolgenden 2en liegen, dann sollten diese 3s gezählt werden. Tun Sie dies iterativ für jedes Level. Ich denke, das sollte funktionieren ...?

z.B.

%Vor%

Das Obige identifiziert die Zeilen 5 und 6 (die den Reihen 6 und 7 im ursprünglichen df entsprechen) als zwei Viere, die zwischen den Dreien liegen. Vielleicht könnte etwas mit dieser Art von Ansatz funktionieren?

    
jalapic 15.03.2016, 15:45
quelle

1 Antwort

0

OK, hier ist ein Stich mit Ihrem zweiten Datensatz zum Testen. Dies ist möglicherweise nicht in allen Fällen korrekt !!

%Vor%

Ich habe diese letzten Schritte geschrieben, damit Sie in Ihrer eigenen interaktiven Sitzung verfolgen können, was passiert (siehe den Ausdruck, um eine Idee zu bekommen), aber Sie können den Druck entfernen und auch die letzten Schritte zu etwas wie lapply(1:dat[,max(level)-1], function(the.level) dat[use=="maybe" & level==the.level,use:=make.pass......]) Als Antwort auf deinen Kommentar solltest du, wenn es eine beliebige Anzahl von Levels gibt, diesen Formalismus definitiv verwenden und ihm mit einem letzten Aufruf von dat[use=="maybe" & level==max(level),use:="yes"] folgen.

Ausgabe:

%Vor%

Wenn das nicht stimmt, kann der Algorithmus grob wie folgt beschrieben werden:

  1. Markieren Sie alle Intervalle wie möglich.
  2. Beginne mit einem bestimmten Level. Wählen Sie ein bestimmtes Intervall ( by=rownum ), das heißt X . Berücksichtigen Sie bei X eine Kopie der Daten in alle Intervalle höherer Ebene.
  3. Markieren Sie eines dieser Elemente in X als "in X enthalten".
  4. Wenn aufeinanderfolgende Intervalle auf derselben Ebene in X enthalten sind, ist X kein guter b / c, es verschwendet Intervalle. In diesem Fall muss die Variable "verwenden" von X als "nein" gekennzeichnet werden, damit wir nie wieder an X denken. [ Hinweis : Wenn es möglich ist, dass nicht aufeinanderfolgende Intervalle in X enthalten sind, oder wenn mehrere Intervalle über mehrere Ebenen hinweg enthalten, kann dies die Lebensfähigkeit von X ruinieren , dann muss diese Logik möglicherweise geändert werden, um enthaltene Intervalle zu zählen, anstatt aufeinanderfolgende zu finden. Ich habe überhaupt nicht darüber nachgedacht, aber es kommt mir jetzt nur so vor, also benutze es auf eigene Gefahr.]
  5. Andererseits, wenn X den Test bestanden hat, haben wir bereits festgestellt, dass es gut ist. Markieren Sie es als "Ja". Aber wichtig , wir müssen jedes einzelne Intervall, das in X enthalten ist, als "no" markieren, sonst vergisst es, wenn es in einem Schritt enthalten ist Intervall und markieren Sie sich selbst als "ja". Dies ist der Nebeneffekt.
  6. Iterieren Sie jetzt und ignorieren Sie alle Ergebnisse, die wir bereits ermittelt haben.
  7. Schließlich werden automatisch alle möglichen "Überbleibsel" auf der höchsten Ebene eingefügt.

Lassen Sie mich wissen, was Sie davon halten - dies ist ein grober Entwurf und einige Aspekte könnten nicht korrekt sein.

    
Philip 15.03.2016, 22:59
quelle

Tags und Links