Fehler: C stack usage 7970048 is too close to the limit

Wie erweitere ich R um eigene Funktionen oder Pakete? Welches Paket ist passend für meine Fragestellung?

Moderatoren: EDi, jogo

Antworten
jalu06
Beiträge: 8
Registriert: Do Jun 18, 2020 12:57 pm

Fehler: C stack usage 7970048 is too close to the limit

Beitrag von jalu06 »

Hallo Forum,

Ich hätte da eine Frage zu einem Problem. Ich versuche eine Funktion zu erstellen, die in einem Datensatz die Events pro Monat zählt, bis eine gewisse Anzahl an Events erreicht wurde. Ich bin noch ziemlich unerfahren mit R und bin mir deshalb unsicher wie genau das mit dem Funktion programmieren abläuft.

Der Code sieht folgendermaßen aus:

s.function <- function(i.monat) {
events <- sum(vierhundertfuenfzig$eventmonat < 'i')
i.monat <- isTRUE(sum(s.function(1:90)<189 ))
pmin(vierhundertfuenfzig$eventtime, i.monat - vierhundertfuenfzig$rtime)
isFALSE(vierhundertfuenfzig$eventtime == vierhundertfuenfzig$eventtime)
}
s.function(i.monat)

Wenn ich dies Laufen lasse, kommt folgende Fehlermeldung

Fehler: C stack usage 7970048 is too close to the limit

Wie kann ich den Code so umschreiben, dass die Zahl der Events ausgegeben wird?
Ich denke, dass ich da einen (großen) Fehler drin habe, denn dieser Fehlercode tritt nur auf, wenn ich eine Schleife (?!) nicht geschlossen habe.

Vielleicht kann mir ja einer Helfen :) Vielen Dank im Voraus

Jalu06
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fehler: C stack usage 7970048 is too close to the limit

Beitrag von bigben »

Hallo jalu,

ohne Kontext und ohne Beispieldaten ist es nicht ganz leicht, sich in Deinen Code hineinzudenken. Klar ist, dass diese Funktion rekursiv sich selbst aufruft und in allen Sprachen, die dafür nicht optimiert sind (sog TCO, tail call optimization) kann das bei häufigen Selbstaufrufen zu Problemen führen.

In Deinem Fall nimmt die Funktion ein Argument i.monat an, dieses wird aber überhaupt gar nicht verwendet, sondern jeweils mit einem neuen Aufruf der Funktion überschrieben.

Über die Zeile

Code: Alles auswählen

i.monat <- isTRUE(sum(s.function(1:90)<189 ))
kommt Dein Programm nie hinaus, die läuft quasi in Endlosschleife, bis kein Stack mehr übrig ist, auf dem R sich merken würde, wie es weiter ginge wenn irgendwann ein return käme.

Mit anderen Worten: Die Funktion ist so programmiert, dass sie unendlich viel Speicher schluckt. Die Funktion muss ganz anders geschrieben werden. Da wir in R unterwegs sind, möglichst ohne viel Rekursion.

Dir dabei zu helfen ist aber ohne Daten und ohne Kontext nahezu unmöglich.

LG,
BernhardZ


Edit: Wenn Du irgendwann mal rekursives Programmieren richtig lernen möchtest, dann empfehle ich ganz klar das Elefantenbuch : https://www.amazon.de/Little-Schemer-Mi ... 262560992/
Sicher keine leichte Feierabendlektüre und sicher nicht optimal für R. Wie ein schlauer Rezensent bei Amazon schrieb:
If you're looking for a "teach yourself botching together mediocre programs in 24 hours" kind of a book, keep your hands off this one. If you're looking for an inspiring, stimulating and unorthodox book that doesn't focus on technical details but rather on ways of thinking, this might be just the right one for you. Even though I rarely program in Scheme, I profit a lot from the general concepts this book has tought me.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jalu06
Beiträge: 8
Registriert: Do Jun 18, 2020 12:57 pm

Re: Fehler: C stack usage 7970048 is too close to the limit

Beitrag von jalu06 »

Hallo Bernhard,

Vielen Dank für die Antwort.

Ich versuche einen Datensatz zu erzeugen, bei dem jeden Monat 5 Patienten dazukommen und das 90 Monate lang. Im Datensatz ist eine Wahrscheinlichkeit hinterlegt ein Ereignis zu bekommen und ich möchte herausfinden in welchem Monat 189 Events erreicht werden.
Das habe ich über i.monat <- isTRUE(s.function(sum(1:90)<189 )) versucht.
Ich habe den Code zusammen mit meinem Prof "entwickelt" allerdings war ich mir schon unsicher wie ich das umsetzen soll und es funktioniert halt nicht so wirklich.

Brauche ich überhaupt eine Funktion um dies herauszufinden?

Vielen Dank!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fehler: C stack usage 7970048 is too close to the limit

Beitrag von bigben »

Hallo jalu,

ich würde wahrscheinlich anfangen, die Zahl der Patienten pro Monat festzuhalten. Beispielsweise so:

Code: Alles auswählen

anzahl.patienten.pM <- seq(from=0, by = 5, length.out = 91)
head(anzahl.patienten.pM)
Jetzt soll mit diesen Patienten irgendetwas mit einer Wahrscheinlichkeit p passieren. Soll das eine Simulation sein oder kann man die Anzahl der Ereignisse einfach durch Anzahl der Patienten Mal Wahrscheinlichkeit bestimmen? Ist p eine Konstante oder nich? Vielleicht so etwas

Code: Alles auswählen

anzahl.patienten.pM <- seq(from=0, by = 5, length.out = 91)
p = .12 # 15%
anzahl.ereignisse.pM <- anzahl.patienten.pM * p
anzahl.ereignisse.gerundet <- round(anzahl.ereignisse.pM, 0)

head(anzahl.ereignisse.gerundet, 20)

which(anzahl.ereignisse.pM > 31)[1]

Ich bin nicht sicher, ob ich alles verstanden habe, aber wenn das hier in die richtige Richtung geht, dann beschreib das Problem gerne genauer.

90 Monate kann man natürlich auch rekursiv simulieren, wenn das leichter fällt. So groß ist der Stack allemal, aber ich glaube nicht, dass das nötig sein wird.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jalu06
Beiträge: 8
Registriert: Do Jun 18, 2020 12:57 pm

Re: Fehler: C stack usage 7970048 is too close to the limit

Beitrag von jalu06 »

Hey,

Ja das geht in die richtige Richtung. Ein einzelnen Monat hab ich so erzeugt

## 1. Monat
covs1 <- data.frame(id = 1:5, trt = rbinom(5, 1, 0.66), rtime=0)

simdat <- simsurv(dist = "exponential", lambdas = c(0.046), betas = c(trt = log(0.67)),
x = covs1, tdefunction = "log", maxt = )
kalendermonat <- data.frame(simdat,covs1, eventmonat = covs1$rtime +simdat$eventtime)
simdat1 <- merge(simdat, kalendermonat)
head(simdat)

Also N von 5, denen durch rbinom zufällig zugeordnet wird, ob sie in Gruppe 1 oder 2 kommen.
in simdat wird dann die Überlebenszeit "ermittelt".
Da man berücksichtigen muss, dass nicht alle im gleichen Monat rekrutiert werden, hab ich rtime als den Monat, in dem der Patient in die Studie gekommen ist. Das ergibt den Kalendermonat. Danach wird der Datensatz zusammengemert. Für alle folgenden Monate das gleiche und jeder Datensatz wird drangemergt.

Ich hab die 90 Monate an Datensätze bereits und ich muss nun herausfinden in welchem Kalendermonat die 189 Events erreicht werden...

Ist bisschen verwirrend, aber ich hoffe man kann das in etwa nachvollziehen.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fehler: C stack usage 7970048 is too close to the limit

Beitrag von bigben »

jalu06 hat geschrieben: Mo Aug 10, 2020 3:27 pmIst bisschen verwirrend, aber ich hoffe man kann das in etwa nachvollziehen.
Ich kann das leider nicht nachvollziehen.
in simdat wird dann die Überlebenszeit "ermittelt".
Scheint so, als müsse man sich ergooglen, welches Paket man sich installieren muss, um Deine Frage nachzuvollziehen. Mein Ansatz, einfach eine Zeile mit dem Wert 5 für 5 Patienten zu haben scheint nicht mit dieser Funktion überein zu gehen, die für jeden Patienten ein individuelles Schicksal erfindet.
hab ich rtime als den Monat, in dem der Patient in die Studie gekommen ist
In dem von Dir gezeigten Code ist rtime eine Konstante und gleich Null.
ch hab die 90 Monate an Datensätze bereits und ich muss nun herausfinden in welchem Kalendermonat die 189 Events erreicht werden...
Mit anderen Worte: Es kann uns eigentlich egal sein, mit welchem Paket und wie Du die Daten erstellt hast, es geht nur darum, ab welcher Zeile in einem Dataframe eine gewisse Zahl von Events erreicht sind. Wie wäre es, wenn Du uns einen Teil Deines DAtensatzes als dput zur verfügung stellst und uns sagst, wo und wie darin die Events codiert sind?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jalu06
Beiträge: 8
Registriert: Do Jun 18, 2020 12:57 pm

Re: Fehler: C stack usage 7970048 is too close to the limit

Beitrag von jalu06 »

Mit anderen Worte: Es kann uns eigentlich egal sein, mit welchem Paket und wie Du die Daten erstellt hast, es geht nur darum, ab welcher Zeile in einem Dataframe eine gewisse Zahl von Events erreicht sind. Wie wäre es, wenn Du uns einen Teil Deines DAtensatzes als dput zur verfügung stellst und uns sagst, wo und wie darin die Events codiert sind?
Also ich weiß nicht wie nötig der Code überhaupt ist und ich weiß gar nicht ob ich den hochladen darf...
Eigentlich geht es darum, dass ich

events <- sum(vierhundertfuenfzig$eventmonat < 63)

diesen Code manuell ausführen lasse (Also der Eventmonat kleiner als 63 ist) ich auf die 189 Events komme.
Ich muss allerdings dies als Funktion so schreiben, dass die Funktion die Monate selber zählt, bis ich auf die 189 Events komme


event.function <- function(x){
sum(vierhundertfuenfzig$eventmonat < 'i')
}

i.monat <- sum(event.function(1:90 < 189))
i.monat

Wenn ich das mit diesem Code versuche, kommt allerdings 450 raus, dabei sollte das <189 ja symbolisieren, dass ein Monat zwischen 1:90 gefunden wird, indem 189 Events geschafft wurden.

Es geht im Endeffekt darum, dass ich es hinbekommen muss, das manuelle aufsummieren der Monate durch eine Funktion zu ersetzen, die es mir ermöglicht die Monate 1:90 aufzusummieren, dass ich 189 Events bis zum Monat 63 bekomme.

Ist in Ordnung, wenn man mir dabei nicht wirklich helfen kann, hatte nur gehofft, dass es ein kleines Problem ist,welches leicht zu beheben ist und ich nur zu doof zum googlen bin....

Viele Grüße :)
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fehler: C stack usage 7970048 is too close to the limit

Beitrag von bigben »

jalu06 hat geschrieben: Di Aug 11, 2020 12:52 pmIst in Ordnung, wenn man mir dabei nicht wirklich helfen kann, hatte nur gehofft, dass es ein kleines Problem ist
Wahrscheinlich ist es ein "kleines Problem" und man könnte Dir gut helfen, nur ändert das nichts daran, dass Du uns sagen musst, wie die Daten aufgebaut sind und wie die Events codiert sind.
Eigentlich geht es darum, dass ich

events <- sum(vierhundertfuenfzig$eventmonat < 63)

diesen Code manuell ausführen lasse (Also der Eventmonat kleiner als 63 ist) ich auf die 189 Events komme.
Das ist Code der zählt, wie oft in der Spalte eventmonat ein Wert kleiner als 63 steht. Ich hatte Dich aber so verstanden dass es darum geht, den Inhalt einer Variablen aufzuaddieren um herauszufinden, wann die Summe mindestens 189 beträgt. Das passt nicht wirklich zusammen.

Code: Alles auswählen

event.function <- function(x){
  sum(vierhundertfuenfzig$eventmonat < 'i')
}
Hier wird gezählt, wie oft der Eintrag in eventmonat kleiner als der Buchstabe i ist. Das hilft doch nicht dabei, ein Problem zu beschreiben!

Code: Alles auswählen

i.monat <- sum(event.function(1:90 < 189))
Hier wird einer Funktion event.function 90 Mal der Wert TRUE übergeben, also wird es auch 90 Mal den gleichen Rückgabewert geben.

durch eine Funktion zu ersetzen, die es mir ermöglicht die Monate 1:90 aufzusummieren
Man darf wohl unterstellen, dass hier die Anzahl der Events im Monat aufsummiert werden soll und nicht die Monate selbst. Für jemanden, der in Fragestellung und Thema nicht drin steckt liefern die Mischung aus unpräziser Sprache und fehlerhaften Beispielcode einfach keine brauchbare Problembeschreibung-
Eventuell kann man raten, was Du meinst, aber dabei hätte ich kein gutes Gefühl dass Du erkennst, wenn man Dir falschen/unpassenden Code gäbe.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten