Data.table mit unterschiedlichen Ergebnissen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von jogo »

klar, Montag geht es weiter.

Gruß, Jörg
Regression hat geschrieben: Fr Mär 02, 2018 4:06 pm hmm... hab eigentlich nur variablen Namen geändert, aber es kommt was anderes raus :?

Muss wohl Montag nach dem Fehler weiter suchen...
Können wir unser Diskus am Montag fortsetzten?

Und Besten Dank schon mal für die investierte Zeit!
Großes Lob!
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

jogo hat geschrieben: Fr Mär 02, 2018 3:55 pm Was mich besonders verwirrt:
1. Scheinbar nimmst Du einige Spalten aus der Tabelle raus, manipulierst diese und verwendest das Ergebnis, um die übergebene Tabelle zu indizieren.
2. Du verwendest data.table-Objekte, aber viele Zugriffe sind eher wie bei Dataframes.
Das stimmt...
liegt einerseits daran, dass ich die Funktion geschrieben hab, bevor ich von data.table erfahren hab und andererseits habe ich gelesen (zumindest so verstanden), dass data.table eine Obermenge von data.frame ist und somit auch damit umgehen kann.
Nachtrag:

Mache mich gleich an die Funktion ran und schaue, wo ich da etwas vergessen hab zu substituieren (also weswegen wir unterschiedliche Ergebnisse haben).
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

jogo hat geschrieben: Fr Mär 02, 2018 3:55 pm

Code: Alles auswählen

library("readxl")
Example_Set <- read_excel("Example_Set.xlsx")

library("data.table")
setDT(Example_Set)
# ...
satz<-Example_Set[V1=="00353874-129C-4FFB-AC0E-B24F7E245118"]
date_forecast(satz)
# > date_forecast(satz)
# (Intercept) 
# "4208772-10-23" 
Kannst Du dies bestätigen?
Bin nun gänzlich verwirrt...
Ich hab das gleiche Ergebnis raus, wieso kommt solch ein krummes Datum raus?
Wenn man die lm via abline darstellt, scheint das Model richtig zu sein, nur das Datum stimmt überhaupt nicht.
Ist das Origin falsch gewählt, und falls ja warum?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von jogo »

Hallo Regression,

wenn Du beim Durchforsten Deiner Funktion bist:
1. möglichst viele data.table-Operationen in einem Aufruf erledigen.
(zur Zeit hast Du einige Operationen nacheinander, die gut in einem [.data.table erledigt werden können)
2. Bitte kontrolliere, ob der Block

Code: Alles auswählen

  if(length(zeilen)<1 & length(Main.Data$Level)>=10){
      lm1.model<- lm(Main.Data$Date~Main.Data$Level)
      level_al<-lm1.model$coefficients[1]+(Level_alert*lm1.model$coefficients[2])
      forecast_alert<-as.Date(level_al,origin = "1970-01-01")
  }
  else{forecast_alert<-"insufficient Data"}
überhaupt jemals ausgeführt werden kann.
So, wie ich den Quelltext lese, ist durch den vorherigen Code stets length(zeilen)>=1
3. Bitte die beiden Codezeilen

Code: Alles auswählen

else{forecast_alert<-"insufficient Data"}
je nach Code-Block anders gestalten:

Code: Alles auswählen

else{forecast_alert<-"insufficient Data A"}
...
else{forecast_alert<-"insufficient Data B"}
... Das erleichtert die Analyse des Verhaltens der Funktion.
4. Hast Du schon mal die Funktion debug() eingesetzt? Für die schwierigen Fälle ist sie einfach unschlagbar.
(Für die mittelschweren Fälle kann man an eine passende Stelle browse() schreiben).
Wenn Du Deine Funktion debuggen willst, einfach vor dem Aufruf der Funktion debug(date_forecast) schreiben, also z.B.:

Code: Alles auswählen

debug(date_forecast)
Example_set[,.(date_forecast(.SD)), by=.(V1)]
Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

jogo hat geschrieben: Mo Mär 05, 2018 9:56 am
wenn Du beim Durchforsten Deiner Funktion bist:
1. möglichst viele data.table-Operationen in einem Aufruf erledigen.
Ja, bin grade dabei... bin selbst äußerst unzufrieden mit der aktuellen Funktion.
jogo hat geschrieben: Mo Mär 05, 2018 9:56 am
4. Hast Du schon mal die Funktion debug() eingesetzt? Für die schwierigen Fälle ist sie einfach unschlagbar.
(Für die mittelschweren Fälle kann man an eine passende Stelle browse() schreiben).
Wenn Du Deine Funktion debuggen willst, einfach vor dem Aufruf der Funktion debug(date_forecast) schreiben, also z.B.:

Code: Alles auswählen

debug(date_forecast)
Example_set[,.(date_forecast(.SD)), by=.(V1)]
Gruß, Jörg
Danke, kannte ich bis lang noch nicht. Probiere ich gleich aus :!:
Und poste die aktualisierte Funktion....

Bis bald.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von jogo »

Schau mal, ob hier etwas brauchbares für Dich dabei ist:

Code: Alles auswählen

library("data.table")
library("readxl")
Example_Set <- read_excel("Example_Set.xlsx")
setDT(Example_Set)

Gruppen <- Example_Set[, unique(V1)]
Example_Set[, .N, V1] # kleine Übersicht
Example_Set[V1==Gruppen[5]]

Example_Set[V1==Gruppen[5], plot(Level ~ Date)]
m <- Example_Set[V1==Gruppen[5], lm(Level ~ Date)]
abline(m)
Koeff <- coef(m)
# L = c1 + c2*Date, umstellen für L=10: Date=(L-c1)/c2
D <- (10 - Koeff[1])/Koeff[2]
D
as.POSIXct(D, origin="1970-01-01")
https://stackoverflow.com/questions/488 ... ate-format

Dies habe ich noch nicht ganz verstanden:
Regression hat geschrieben: Fr Mär 02, 2018 3:38 pm Im Prinzip soll das Datum für den Datensatz ab der letzten Flanke vorausgesagt werden, wann der Level 10 erreicht wird. Wenn es noch keine gibt dann eben aus dem aktuellen Datensatz, darauf wird geachtet, dass eben die Flanke groß genug ist also ab Level 60, und genügend Abmessungen vorhanden sind.
Vielleicht ist es sowas wie in diesem Codefetzen:

Code: Alles auswählen

set.seed(20)
L <- data.table(x=sample.int(20, 50, repl=TRUE))
y <- L[ , max(which(x>17))]
tail(L, -y)
Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

jogo hat geschrieben: Mo Mär 05, 2018 11:41 am
Dies habe ich noch nicht ganz verstanden:
Regression hat geschrieben: Fr Mär 02, 2018 3:38 pm Im Prinzip soll das Datum für den Datensatz ab der letzten Flanke vorausgesagt werden, wann der Level 10 erreicht wird. Wenn es noch keine gibt dann eben aus dem aktuellen Datensatz, darauf wird geachtet, dass eben die Flanke groß genug ist also ab Level 60, und genügend Abmessungen vorhanden sind.
Gruß, Jörg
Es soll die "Lebensdauer" eines Devices (V1) bestimmt werden und vorausgesagt werden wann die Lebensdauer nur noch 10 (Prozent) beträgt (also Level= 10).
Der Lebenszyklus ist periodisch von ~100 bis ~0 Prozent.
Mich interessiert (in diesem Fall) lediglich der letzte Lebenszyklus, also ab der letzten Flanke (last_flanc), falls noch keine Flanke vorhanden, so betrachte ich den kompletten Datenbestand für die aktuelle Gruppe

Code: Alles auswählen

Gruppen[i].
Dazu berechne ich die Differenz von Level. An der Stelle wo es eine positive Differenz auftritt, beginnt ein neuer Lebenszyklus.
Weitere Restrektion: Der Lebenszyklus muss mind. ab 60% bedinnen.

Code: Alles auswählen

zeilen<-Main.Data[,which(Difference>60)]
Weiter prüfe ich, ob ausreichend Messdaten vorhanden ist (also mehr als 10) mit:

Code: Alles auswählen

if(length(last_flanc$V1)>=10){...} 
ich hoffe es ist etwas klarer geworden.

Hier ist nun meine aktuelle Funktion, die ebenfalls das richtige Datum Format ausgibt:

Code: Alles auswählen

test_date_forecast<-function(Main.Data,Level_alert=10){
    setDT(Main.Data)
    Main.Data[,Difference:=c(0,diff(Level))]
    zeilen<-Main.Data[,which(Difference>60)]
    
    if(length(zeilen)>0){
      last_flanc<-Main.Data[last(zeilen):length(Main.Data$V1),]
      if(length(last_flanc$V1)>=10){
        lm1.model<- lm(last_flanc$Date~last_flanc$Level)
        Level_al<-lm1.model$coefficients[1]+(Level_alert*lm1.model$coefficients[2])
        forecast_alert<-as.Date(Level_al,origin = "1970-01-01")
      }else{forecast_alert<-"insufficient Data"}
    }
    else{
      if(length(Main.Data$Level)>=10){
        lm1.model<- lm(Main.Data$Date~Main.Data$Level)
        Level_al<-lm1.model$coefficients[1]+(Level_alert*lm1.model$coefficients[2])
        forecast_alert<-as.Date(Level_al,origin = "1970-01-01")
      }
      else{forecast_alert<-"insufficient Data"}
    }
    forecast_alert<-as.character(forecast_alert)
    
    return(forecast_alert)
  }
Nachtrag:

Code: Alles auswählen

Ergebnis<-Example.set[,.(dat_forecast(.SD)), by=V1])
läuft immer noch nicht :(

es kommt folgende Fehlermeldung:
`[.data.table`(Main.Data, , `:=`(Difference, c(0, diff(Level)))) :
.SD is locked. Using := in .SD's j is reserved for possible future use; a tortuously flexible way to modify by group. Use := in j directly to modify by group by reference.


NACHTRAG:

ES LÄUFT!!!!
Kleiner Fix hats getan:

Code: Alles auswählen

Difference<-c(0,diff(Main.Data$Level))
Noch mal Besten Dank für den Support!!!!
Zuletzt geändert von Regression am Mo Mär 05, 2018 1:43 pm, insgesamt 1-mal geändert.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von jogo »

Hier noch ein Puzzelteil zum Umsetzen der Logik:

Code: Alles auswählen

Example_Set[, Level_diff := Level - shift(Level), V1]
Example_Set[, Zykl:=rleidv(Level_diff>0), V1]
Example_Set[, .N, by=.(V1, Zykl)]
Example_Set[V1==Gruppen[2]]
Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

jogo hat geschrieben: Mo Mär 05, 2018 1:39 pm Hier noch ein Puzzelteil zum Umsetzen der Logik:

Code: Alles auswählen

Example_Set[, Level_diff := Level - shift(Level), V1]
Example_Set[, Zykl:=rleidv(Level_diff>0), V1]
Example_Set[, .N, by=.(V1, Zykl)]
Example_Set[V1==Gruppen[2]]
Gruß, Jörg
Sorry hab zu spät Deine Antwort gesehen...
Sind wieder paar neue Funktionen dabei, die ich nicht kenne:
zu einem: shift()
zu anderem: rleidv()

Werde gleich die Dokumentation dazu lesen.
Nochmal besten Dank :!:
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von jogo »

sollte der letzte Zyklus auch eine Mindestanzahl von Zeitpunkten haben, damit er für die Regression verwendet wird?

Ansonsten sieht es bei mir so aus:

Code: Alles auswählen

library("data.table")
library("readxl")
Example_Set <- read_excel("Example_Set.xlsx")
setDT(Example_Set)

Gruppen <- Example_Set[, unique(V1)]
Example_Set[, .N, V1] # kleine Übersicht


Example_Set[, Level_diff := Level - shift(Level), V1]
Example_Set[, Zykl:=rleidv(Level_diff>0), V1]
Example_Set[, .(.N, m=max(Level)), by=.(V1, Zykl)]

whichZykl <- function(Gruppe) {
  Z <- Gruppe[, .(.N, m=max(Level)), by=Zykl]
  nZ <- Z[, .N]
  if (nZ %% 2) { Z <- tail(Z, -1); nZ <- nZ -1 }
  Z[m>=60, last(Zykl)]
}

date_forecast<-function(Gruppe, Level_alert=10) {
  regZyk <- whichZykl(Gruppe)
  regData <- Gruppe[Zykl %in% c(regZyk-1, regZyk)]
  
  lm1.model <- lm(Date ~ Level, data=regData)
  D <- predict.lm(lm1.model, newdata = data.frame(Level=10))
  as.POSIXct(D, origin="1970-01-01")
}

Example_Set[, date_forecast(.SD), by=V1]
Antworten