Crash von RStudio (gelöst)

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

Moderatoren: EDi, jogo

Antworten
Tonelock
Beiträge: 4
Registriert: Mo Mär 18, 2019 11:09 am

Crash von RStudio (gelöst)

Beitrag von Tonelock »

Hallo zusammen,

ich knabbere seit geraumer Zeit an einem Problem, für das ich noch keine Antwort finden konnte. Und zwar will ich den Code unten ausführen. Dieser simuliert mir 1000 mal einen Illness-Death Prozess https://journals.plos.org/plosone/artic ... ne.0123489 und ich möchte daraus eine Übergangswahrscheinlichkeit auf zwei Arten schätzen (Details sind erst mal nicht so wichtig). Dazu berechne ich eine empirische Übergangsmatrix mitdem Befehl etm aus dem etm-package. Jedoch stürzt RStudio mir jedes mal (nach einer gewissen Anzahl Iterationen, so 10-50) ab mit folgender Fehlermeldung :

error:: Mat::operator() index out of bounds
terminate called after throwing an instance of 'std::logic_error'
what(): Mat::operator() index out of bounds

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

RStudio zeigt mir die Fehlermeldung '<p>R encountered a fatal error.</p>The session was terminated.' Danach muss ich die Sitzung neu starten usw.

Code: Alles auswählen


rm(list = ls())

library(etm)
library(mstate)

#markovian case

BSiter <- 300

bs_one_iter <- function(n, data, max_id, times=x, h, tra){
    
    multinom <- sample(1:n, replace=T)
    
    data_bs <- subset(data, id==data$id[multinom[1]])
    for(k in 2:n){
      data_temp <- subset(data, id==data$id[multinom[k]])
      data_temp$id <- data_temp$id + max_id * k
      data_bs <- rbind(data_bs, data_temp)
    }
    
    etmAJE <- etm(data_bs, state.names = 0:2, tra=tra, cens.name=3, s=s, t=t, covariance=FALSE, delta.na=FALSE)
    PijAJE <- c(0,etmAJE$est[i + 1,j + 1,])
    timesAJE <- c(s,etmAJE$time)
    
    good_ind <- which(data$entry <= s & data$exit >s & data$from==i)
    rel_ids <- unique(data$id[good_ind])
    npeople <- length(rel_ids)
    data_s <- data[data$id %in% rel_ids,]
    #Remove all intervals ending before s
    data_s <- data_s[data_s$exit >= s,]
    #Truncate all intervals starting before s
    data_s$entry[data_s$entry <s]<-s
    
    etm_s <- etm(data_s, state.names = 0:2, tra=tra, cens.name=3, s=s, t=t, covariance=FALSE, delta.na=FALSE)

    return(k)
  }
  

for (k in 1:1000){

  # simulation
  n <- 100 
  id <- 1:n
  rate_0 <- 1/15
  start_state <- rep(0,n)
  T_0 <- rexp(n,rate_0) # time in state 0
  p <- 0.7
  r <- runif(n,0,1)
  state_1 <- 1*(r < p) + 2*(p <= r & r < p+(1-p)/2) + 3*(1-(1-p)/2 <= r)
  rate_1 <- 1/30
  T_1 <- rexp(n,rate_1) # time in state 1
  q <- 0.8
  state_2 <- rbinom(n,1,1-q) + 2
  # results in time-continuous markovian multi-state process'

  
  # state 3 = censored
  
  # next we transform the generated data into a data matrix that shows transition times and states per patient
  
  all_datas <- matrix(rep(0,5*2*n),nrow = 2*n)
  count <- 1
  for (i in id){
    if(state_1[i] == 3 | state_1[i] == 2){
      all_datas[count,] <- c(i,0,state_1[i],0,T_0[i])
    }
    else{
      all_datas[count,] <- c(i,0,1,0,T_0[i])
      count <- count + 1
      all_datas[count,] <- c(i,1,state_2[i],T_0[i],T_0[i] + T_1[i])
    }
    count <- count + 1
  }
  
  datas <- data.frame(all_datas[-which(all_datas[,1] == 0),])
  names(datas) <- c("id","from","to","entry","exit")
  
  tra <- matrix(c(F,T,T,F,F,T,F,F,F),3,3,byrow=T)
  
  # from illness to death
  i <- 1
  j <- 2
  # time stamp
  s <- 5
  t <- 100
  
  # estimate transition probabilities
  etmAJE_markov <- etm(datas, state.names = 0:2, tra=tra, cens.name=3, s=s, t=t, covariance=FALSE, delta.na=FALSE)
  PijAJE_markov <- c(0,etmAJE_markov$est[i + 1,j + 1,])
  timesAJE_markov <- c(s,etmAJE_markov$time)
  
  good_ind_markov <- which(datas$entry <= s & datas$exit >s & datas$from == i)
  rel_ids_markov <- unique(datas$id[good_ind_markov])
  npeople_markov <- length(rel_ids_markov)
  # "good" data
  datas_s <- data.frame(datas[datas$id %in% rel_ids_markov,])
  # Remove all intervals ending before s
  datas_s <- datas_s[datas_s$exit >= s,]
  #Truncate all intervals starting before s
  datas_s$entry[datas_s$entry < s] <- s
  
  etm_s_markov <- etm(datas_s, state.names = 0:2, tra=tra, cens.name=3, s=s, t=t, covariance=FALSE, delta.na=FALSE)
  F0_markov <- c(0,etm_s_markov$est[i + 1,j + 1,])
  timesTE_markov <- c(s,etm_s_markov$time)
  
  # Computing the Aalen Johansen and Titman estimators
  
  h <- 0.5
  x_markov <- seq(s,t,h)

  # Computing the test statistic
  
  max_id_markov <- max(datas$id)
  BSstat_pred <- replicate(BSiter, bs_one_iter(n, datas, max_id_markov, times=x_markov, h, tra))

}

Ich denke, dass der Fehler passiert, wenn die etm Funktion aufgerufen wird, und dass es an den simulierten Daten liegen muss, die sie irgendwie nicht verarbeiten kann, da der Prozess ja jeweils ein paar Schleifendurchläufe funktioniert.

Hat jemand eine Idee, wo genau der Fehler passieren könnte und was an den simulaierten Daten das Problem ist?

Btw. Wenn ich die Daten wie folgt simuliere, läuft der Prozess problemlos durch.

Ich habe auch schon versucht den Autor des packages zu kontaktieren, jedoch stimmt seine Adresse in der Dokumentation nicht mehr... Die Konsole stürzt mir bei der Ausführung ebenso ab.

Code: Alles auswählen

  
 # zuerst wie oben bis Kommentar '  # simulation'
  
 n <- 1000
  id <- 1:n
  size <- 50
  box <- rexp(size,1/2)
  lambda_0 <- 10
  nc0 <- rpois(n,lambda_0) #number of coins to draw in state 0
  r <- runif(n,0,1)
  p <- 0.7
  state_1 <- 1*(r < p) + 2*(p <= r & r < p+(1-p)/2) + 3*(1-(1-p)/2 <= r)
  lambda_1 <- 15
  nc1 <- rpois(n,lambda_1)  #number of coins to draw in state 1
  q <- 0.8
  state_2 <- rbinom(n,1,1-q) + 2
  
  T_0 <- rep(0,n)
  T_1 <- rep(0,n)
  
  # 'draw' coins from the box without replacement and note the sum to get the time of transfer between states
  # results in a time-continuous non-markov multi state process

  for (i in id){
  
    zero_ind <- sample(size,nc0[i])
    zero_samp <- box[zero_ind]
    T_0[i] <- sum(zero_samp)
    remain <- box[-zero_samp]
    
    one_ind <- sample(size - nc0[i],nc1[i])
    one_samp <- remain[one_ind]
    T_1[i] <- sum(one_samp)
  }
  ... # dann weiter wie ab dem Kommentar   '# next we transform the generated data into a data matrix that shows transition times and states per patient'
  
Für Ideen und Hilfestellungen wäre ich sehr dankbar.

Entschuldigt, dass der Code relativ lang ist, aber leider habe ich ziemlich viele Abhängigkeiten darin, die nicht so ohne weiteres auszumerzen sind (es handelt sich schon um ein vereinfachtes Beispiel. Deswegen gibt die Funktion bs_one_iter auch Unsinn zurück.). Bei Fragen helfe ich natürlich.

Danke und viele Grüße

Tonelock
Zuletzt geändert von Tonelock am Do Mär 28, 2019 2:03 pm, insgesamt 3-mal geändert.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Crash von RStudio

Beitrag von jogo »

Hallo Tonelock,

willkommen im Forum!
Den Absturz konnte ich reproduzieren. Ein Fehler der Art "index out of bounds" bedeutet, dass man mit einem Indexzugriff auf eine Stelle außerhalb des Objektes zugreift, z.B.:

Code: Alles auswählen

x <- matrix(1, 3,3)
x[5,]
Dein Code ist schon ziemlich umfangreich. Deshalb gebe ich erstmal nur allgemeine Empfehlungen zum Debuggen:
1. Mit message(...) kann man gut Nachrichten erzeugen, z.B.

Code: Alles auswählen

message(paste0("+++ Laufindex i jetzt: ", i))
2. Setzen von Breakpoints: dort hält die Ausführung an und man kann von der Konsole aus die Daten inspizieren; anschließend kann man das Programm weiterlaufen lassen.
3. Mit debug(Funktionsname) kommt man in den debug-Modus immer dann, wenn die genannte Funktion aufgerufen wird. Dies dürfte bei Deinem Code schwierig sein, da er kaum eine Untergliederung in verschiedene Funktionen hat.

Ich habe das Programm mal zwischendurch abgebrochen und habe festgestellt, dass auch Warnungen generiert wurden:

Code: Alles auswählen

49: In etm.data.frame(data_s, state.names = 0:2, tra = tra,  ... :
  You may have specified more possible transitions than actually present in the data
50: In etm.data.frame(data_s, state.names = 0:2, tra = tra,  ... :
  You may have specified more possible transitions than actually present in the data
Sind diese Dir bekannt und kannst Du sie als harmlos einstufen?

Gibt es einen Grund, weshalb die Definition der Funktion bs_one_iter() innerhalb einer for-Schleife steht?
(..., so dass diese Funktion bei jedem Schleifendurchlauf definiert wird)

Gruß, Jörg
Tonelock
Beiträge: 4
Registriert: Mo Mär 18, 2019 11:09 am

Re: Crash von RStudio

Beitrag von Tonelock »

Hallo Jörg,

danke für deine Antwort. Genau, das mit dem index out of bounds war mir auch schon aufgefallen. Ich vermute, dass bei der Simulation der Daten bei der Ausführung der etm Funktion manchmal irgendwo ein leerer Vektor erzeugt wird, da die Funktion die eingehenden Daten auf verschiedene Weisen nach Kriterien filtert und diese wohl bei manchen simulierten Datensätzen nirgends erfüllt werden. Jedoch passiert das irgendwann während der Ausführung der etm Funktion, weswegen ich mit Breakpoints bisher noch nicht so weit gekommen bin (Dazu müsste ich wohl den Quellcode der Funktion verändern). Bist du auch der Meinung dass der Fehler bei der etm Funktion ausgelöst wird?

Die Warnungen erhalte ich auch (sowohl bei den Simulationen die funktionieren als auch bei den anderen), sie behindern aber die Ausführung nicht. Ich denke dass R bemerkt dass bestimmte Übergänge (z.B. von Stadium 2 zu Stadium 0) nicht vorkommen. Es handelt sich um ein Modell aus der Survival-Analysis (Illness-Death Model) und in meinem Fall bedeutet 2 dass ein Individuum tot ist und 0 steht für ein gesundes Individuum. Daher macht ein Übergang von 2 nach 0 keinen Sinn.

Könnte es an meiner verwendeten R-Version liegen? Ich habe mal verschiedene ausprobiert (R 3.5.1, R 35~1.1, R 3.4.0)

Viele Grüße

Tonelock
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Crash von RStudio

Beitrag von Athomas »

Ist es möglich, dass Du mit der Numerierung der Zustände (0 bis 2 vs. 1 bis 3) durcheinander gekommen bist?
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Crash von RStudio

Beitrag von jogo »

Hallo Tonelock,
Tonelock hat geschrieben: Mo Mär 18, 2019 2:10 pm danke für deine Antwort. Genau, das mit dem index out of bounds war mir auch schon aufgefallen. Ich vermute, dass bei der Simulation der Daten bei der Ausführung der etm Funktion manchmal irgendwo ein leerer Vektor erzeugt wird, da die Funktion die eingehenden Daten auf verschiedene Weisen nach Kriterien filtert und diese wohl bei manchen simulierten Datensätzen nirgends erfüllt werden. Jedoch passiert das irgendwann während der Ausführung der etm Funktion, weswegen ich mit Breakpoints bisher noch nicht so weit gekommen bin (Dazu müsste ich wohl den Quellcode der Funktion verändern). Bist du auch der Meinung dass der Fehler bei der etm Funktion ausgelöst wird?
ich halte es für möglich, dass die Funktion mit einigen absurden Datenkonstellationen nicht umgehen kann.
Ich habe jeden Aufruf der Funktion etm() mit entsprechenden Nachrichtenausgaben eingeklammert, z.B.:

Code: Alles auswählen

    message("+++3 vor dem Aufruf von etm()")
    etmAJE <- etm(data_bs, state.names = 0:2, tra=tra, cens.name=3, s=s, t=t, covariance=FALSE, delta.na=FALSE)
    message("+++3 etm() wurde beendet +++")
... und fürwahr der Absturz erfolgt innerhalb der Funktion etm().
:!: Du müsstest herausfinden, bei welcher Datenkonstellation der Absturz stattfindet :!:
Die Warnungen erhalte ich auch (sowohl bei den Simulationen die funktionieren als auch bei den anderen), sie behindern aber die Ausführung nicht.
Man sollte auch Warnungen ernst nehmen. Nur weil bei einer Warnung die Ausführung nicht abgebrochen wird, heißt es nicht, dass alles in Ordnung ist. Erst wenn man sich sicher ist, dass die Warnungen harmlos und unvermeidbar sind, kann man sie akzeptieren.
Hier ist ein Beispiel für einen beliebten folgenschweren Fehler, den R nur mit einer Warnung quittiert:

Code: Alles auswählen

x <- 1:4
if (x > 2) print("hallo")
Ich denke dass R bemerkt dass bestimmte Übergänge (z.B. von Stadium 2 zu Stadium 0) nicht vorkommen. Es handelt sich um ein Modell aus der Survival-Analysis (Illness-Death Model) und in meinem Fall bedeutet 2 dass ein Individuum tot ist und 0 steht für ein gesundes Individuum. Daher macht ein Übergang von 2 nach 0 keinen Sinn.
Das kann ich nicht beurteilen, weil ich heute erstmalig die beiden Pakete installiert habe ...
Könnte es an meiner verwendeten R-Version liegen? Ich habe mal verschiedene ausprobiert (R 3.5.1, R 35~1.1, R 3.4.0)
kurz gesagt: nein - eher könnte es noch die Version der verwendeten Pakete sein (und die Paketversionen sind manchmal von bestimmten R-Versionen abhängig).
Auf StackOverflow ist jedenfalls kein Zusammenhang zwischen der Nutzung des Paketes etm und irgendwelchen Crashes festzustellen:
https://stackoverflow.com/search?q=%5Br%5D+etm+crash

Die Art und Weise Deiner Programmierung lässt mich eher zu der Meinung kommen:
wahrscheinlich hast Du das Datenmanagement nicht gut im Griff.
Es gibt etliche Stellen, an denen Du recht kompliziert programmiert hast: (manchmal sind es nur Kleinigkeiten), aber an anderen Stellen ist einfach nicht zu durchschauen, was Du dort treibst. Dort würde es auch nichts nützen, wenn ich versuche, es besser zu codieren, weil ich mir nicht sicher bin, ob das, was Du dort programmiert hast, wirklich das ist, was Du programmieren wolltest.
Auch ist der Code an genau diesen Stellen besonders wenig kommentiert. Hinzu kommt, dass auch Deine Art der Verwendung (bzw. Nichtverwendung) von Leerzeichen mir das Lesen erschwert. Üblicherweise halte ich es so, dass ich mich auch beim Programmieren weitestgehend an die Satzvorschriften für Texte halte: nach einem Komma folgt ein Leerzeichen.

Gruß, Jörg
p.s.: Du hast mir meine Frage nicht beantwortet bezüglich der Funktionsdefinition. :(
Tonelock
Beiträge: 4
Registriert: Mo Mär 18, 2019 11:09 am

Re: Crash von RStudio

Beitrag von Tonelock »

Hallo zusammen,
Athomas hat geschrieben: Mo Mär 18, 2019 2:17 pm Ist es möglich, dass Du mit der Numerierung der Zustände (0 bis 2 vs. 1 bis 3) durcheinander gekommen bist?
Die Nummerierung der Zustände sollte soweit an jeder Stelle passen, das habe ich schon überprüft. Außerdem habe ich mal probeweise 0 bis 2 durch 1 bis 3 ersetzt (und den Zensierungszustand von 3 durch 4) und erhalte dieselbe Fehlermeldung.
jogo hat geschrieben: Mo Mär 18, 2019 2:37 pm :!: Du müsstest herausfinden, bei welcher Datenkonstellation der Absturz stattfindet :!:
Ja das habe ich schon erfolglos probiert (Das Image vor jedem Aufruf von etm gespeichert). Meine Simulationen hängen ja von verschiedenen Parametern ab, die ich systematisch angepasst habe, um zu sehen, wo der Fehler liegen könnte. Leider bisher ohne Erfolg.
jogo hat geschrieben: Mo Mär 18, 2019 2:37 pmMan sollte auch Warnungen ernst nehmen. Nur weil bei einer Warnung die Ausführung nicht abgebrochen wird, heißt es nicht, dass alles in Ordnung ist. Erst wenn man sich sicher ist, dass die Warnungen harmlos und unvermeidbar sind, kann man sie akzeptieren.
Hier ist ein Beispiel für einen beliebten folgenschweren Fehler, den R nur mit einer Warnung quittiert:
Ja, da hast du grundsätzlich natürlich Recht. Ich habe jedoch auch nach umfangreicher Recherche noch nicht im Detail herausgefunden, weshalb diese Warnung geworfen wird. Es war nur meine Vermutung, dass erwartet wird, dass Übergänge von allen Stadien stattfinden können. Da es funktioniert hat (auch in den simulierten Daten die durchliefen kam diese Warnung), habe ich es im Weiteren erst mal ignoriert. Da kann ich mich allerdings auch noch mal ran setzen :)
jogo hat geschrieben: Mo Mär 18, 2019 2:37 pm p.s.: Du hast mir meine Frage nicht beantwortet bezüglich der Funktionsdefinition. :(
Sorry, das habe ich überlesen gehabt. Das war eine Schlampigkeit meinerseits, als ich meinen Code auf ein lauffähiges Beispiel zurückgeführt habe. Man kann (und sollte) die Funktion außerhalb der Schleife definieren (Hab es geändert).
jogo hat geschrieben: Mo Mär 18, 2019 2:37 pmDie Art und Weise Deiner Programmierung lässt mich eher zu der Meinung kommen:
wahrscheinlich hast Du das Datenmanagement nicht gut im Griff.
Was genau meinst du damit? Hast du Tipps, wie ich die Programmierung und das Datenmanagement verbessern könnte?

Danke schon mal für die vielen Hilfestellungen und viele Grüße

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

Re: Crash von RStudio

Beitrag von jogo »

Hallo Tonelock,
Tonelock hat geschrieben: Mo Mär 18, 2019 3:38 pm
jogo hat geschrieben: Mo Mär 18, 2019 2:37 pm :!: Du müsstest herausfinden, bei welcher Datenkonstellation der Absturz stattfindet :!:
Ja das habe ich schon erfolglos probiert. Meine Simulationen hängen ja von verschiedenen Parametern ab, die ich systematisch angepasst habe, um zu sehen, wo der Fehler liegen könnte. Leider bisher ohne Erfolg.
wenn man mit Zufallszahlen arbeitet, sollte man in so einem Fall am Anfang

Code: Alles auswählen

set.seed(...)
verwenden; so werden beim nächsten Programmlauf exakt die gleichen Zufallszahlen verwendet.
jogo hat geschrieben: Mo Mär 18, 2019 2:37 pmDie Art und Weise Deiner Programmierung lässt mich eher zu der Meinung kommen:
wahrscheinlich hast Du das Datenmanagement nicht gut im Griff.
Was genau meinst du damit? Hast du Tipps, wie ich die Programmierung und das Datenmanagement ändern könnte?
Ich habe einige Anmerkungen in der vorherigen Nachricht ergänzt.
Ansonsten hier einige Vorschläge:
1. Du könntest die Matrix all_datas nach diesem Muster erzeugen:

Code: Alles auswählen

myf <- function(i) if ((i %% 3)==0) return(11:18) else return(21:24) 
matrix(unlist(lapply(1:6, myf)), nrow=4)
Die Funktion myf() liefert je nach Input verschieden lange Vektoren zurück. Mit unlist() wird das Ergebnis in einen langen Vektor umgewandelt, der dann durch matrix() umgebrochen wird.

2. Dieser Teil ist auf alle Fälle zu kompliziert (dies ist die Stelle, die ich nicht verstehe):

Code: Alles auswählen

    multinom <- sample(1:n, replace=T)
    
    data_bs <- subset(data, id==data$id[multinom[1]])
    for(k in 2:n){
      data_temp <- subset(data, id==data$id[multinom[k]])
      data_temp$id <- data_temp$id + max_id * k
      data_bs <- rbind(data_bs, data_temp)
    }
Vielleicht solltest Du erstmal die Subsets erzeugen und in einer Liste sammeln; das macht man mit lapply(). Das Ergebnis kann dann mit do.call(rbind, dieListeVonLapply) zusammengeklebt werden.
:!: Bei mir war der Absturz genau in dem folgenden Aufruf von etm()

3. Du definierst das Objekt id <- 1:n - gleichzeitig hast Du Dataframes, in denen es eine Spalte $id gibt.
Ich würde in den for-Schleifen for (i in 1:n) schreiben und auf das Objekt id verzichten.
Noch stärker wäre allerdings mein Bemühen, auf die for-Schleifen zu verzichten (soweit es geht).

4. TRUE nicht abkürzen. Sollte man irgendwann T <- 0 definieren, ist man verloren (das kann mit TRUE <- 0 nicht passieren).

5. rep(0, 100) ist identisch mit numeric(100)

6. manchmal kann man die Möglichkeiten der Syntax für eine bessere Lesbarkeit ausnutzen, evtl.

Code: Alles auswählen

conf_level <- test_accepted <- numeric(1000)
(das ist aber Geschmackssache)

7. zusammengehörende Sachen am gleichen Ort schreiben:

Code: Alles auswählen

  s <- 5; t <- 100; h <- 0.5
  x_markov <- seq(s, t, h)
8. Möglichst wenig Objekte erzeugen.

9. Möglichst Funktionen definieren für überschaubare Aufgaben. Funktionen sind sicher, wenn man kein Teufelszeug einsetzt.

... ...

Gruß, Jörg
Tonelock
Beiträge: 4
Registriert: Mo Mär 18, 2019 11:09 am

Re: Crash von RStudio

Beitrag von Tonelock »

Guten Abend zusammen,

zuerst mal danke für die vielen guten Tipps und Verbesserungsvorschläge @jogo, ich habe sie teilweise in meinen Code eingearbeitet und nehme mir sie in Zukunft noch verstärkt zu Herzen :)
Dieser Teil ist auf alle Fälle zu kompliziert (dies ist die Stelle, die ich nicht verstehe):

Code: Alles auswählen


    multinom <- sample(1:n, replace=T)
    
    data_bs <- subset(data, id==data$id[multinom[1]])
    for(k in 2:n){
      data_temp <- subset(data, id==data$id[multinom[k]])
      data_temp$id <- data_temp$id + max_id * k
      data_bs <- rbind(data_bs, data_temp)
    }
Vielleicht solltest Du erstmal die Subsets erzeugen und in einer Liste sammeln; das macht man mit lapply(). Das Ergebnis kann dann mit do.call(rbind, dieListeVonLapply) zusammengeklebt werden.
:!: Bei mir war der Absturz genau in dem folgenden Aufruf von etm()
In dem Code findet ein sog. Bootstrapping statt, wo zufällig n mal aus dem Data Frame data gesampelt wird (mit Mehrfachziehung) und dann ein neuer Bootstrap-Datensatz zusammengebaut wird. Wir nehmen für jede id zwischen 1 und n die entsprechende zufällige Bootstrap sample id (ein zufälliger neuer Wert zwischen 1 und n), wählen die entsprechenden Zeilen aus data, schreiben sie in data_temp (mit einer neuen id) und kleben das Ganze hinten an data_bs ran. Das gibt uns aus einer Stichprobe mit begrenztem Umfang eine neue zufällige Stichprobe mit denselben Verteilungseigenschaften.
Die for-Schleife spart hier ein bisschen Speicherplatz im Vergleich zu lapply, oder? Ich kann es auch mal anders probieren. Da gibt es auch eine R-Funktion zu (Im package boot). Mit einem lapply-Befehl über eine Liste aus Bootstrap-Samples und einer neu definierten Funktion bs_one_iter könnte man das vielleicht alles ein bisschen kürzen.

Auf jeden Fall habe ich mein ursprüngliches Problem jetzt dadurch in den Griff bekommen, dass ich eine ältere Version des Packages etm wähle (0.6-2 statt 1.0.4), hier läuft der Code auf wundersame Weise durch. Ich werde mir trotzdem noch mal den Quellcode der etm Funktion anschauen und versuchen herauszufinden, was bei der neueren Version die Probleme verursacht. Falls ich eine Antwort finde, werde ich sie hier posten. Wer zwischenzeitlich dem Problem auf die Spur kommt, kann mich natürlich auch erleuchten :)

Viele Grüße und gute Nacht

Tonelock
Antworten