Probleme bei Try in Verbindung mit gewichteter nlsLM

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

Moderatoren: EDi, jogo

Antworten
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Probleme bei Try in Verbindung mit gewichteter nlsLM

Beitrag von schubbiaschwilli »

Gude!

Ich versuche mittels nlsLM, Daten an eine Funktion mit mehreren Parametern anzupassen.
Das läuft in einer Schleife, und die Daten werden aus einer Datenbank gelesen, in der auch die Ergebnisse gespeichert werden. Und da die nlsLM-Funktion in manchen Fällen abbricht, ist das mittels Try gekapselt, und das funktioniert auch. (Und mit nlsLM stabiler als mit nls.)
Jetzt versuche ich, die nlsLM-Funktion zu gewichten - Und bekomme Fehler. Und da dieser Fehler auch im modifizierten Beispiel aus der Doku auftritt, erkläre ich mein Problem daran.

Wie bereits erwähnt, findet man in der "wfct {minpack.lm} R Documentation - Weighting function that can be supplied to the weights argument of nlsLM or nls" folgenden Code:

Code: Alles auswählen

library(minpack.lm);

### Examples from 'nls' doc ###
## note that 'nlsLM' below may be replaced with calls to 'nls'
Treated <- Puromycin[Puromycin$state == "treated", ]

## Weighting by inverse of response 1/y_i:
nlsLM(rate ~ Vm * conc/(K + conc), data = Treated, start = c(Vm = 200, K = 0.05), weights = wfct(1/rate))
Der Code funktioniert auch. (Ich hab' es mit 3.4.0 64 und 32 Bit und MRO 3.4.0 auf Windows 10 Enterprise probiert.)

Nun baue ich ein Try drumherum:
---schnipp---

Code: Alles auswählen

try(result<-nlsLM(rate ~ Vm * conc/(K + conc), data = Treated, start = c(Vm = 200, K = 0.05), weights = wfct(1/rate)), silent=FALSE)
---schnapp---

Dann bekomme ich folgenden Fehler:
---schnipp---

Code: Alles auswählen

Error in DATA[[i]] : Indizierung außerhalb der Grenzen
---schnapp---

Mit 'weights = wfct(1/rate))' und ohne Try geht es:
---schnipp---

Code: Alles auswählen

nlsLM(rate ~ Vm * conc/(K + conc), data = Treated, start = c(Vm = 200, K = 0.05), weights = wfct(1/rate))
---schnapp---

Ohne 'weights = wfct(1/rate))' und mit Try geht es:
---schnipp---
try(result<-nlsLM(rate ~ Vm * conc/(K + conc), data = Treated, start = c(Vm = 200, K = 0.05)), silent=FALSE)
---schnapp---

Aber nicht beides zusammen. Tja,... Und jetzt sitz' ich vor meinem Bioldschirm und kuck' wie 'ne Kuh wenn's donnert... - Und bin für jede Hilfe dankbar.

Dank&Gruß
schubbiaschwilli
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Probleme bei Try in Verbindung mit gewichteter nlsLM

Beitrag von EDi »

Kannst du nicht die weights direkt berechnen und übergeben - kommt aus selbe hinaus:

Code: Alles auswählen

library(minpack.lm);

### Examples from 'nls' doc ###
## note that 'nlsLM' below may be replaced with calls to 'nls'
Treated <- Puromycin[Puromycin$state == "treated", ]

## Weighting by inverse of response 1/y_i:
x <- nlsLM(rate ~ Vm * conc/(K + conc), data = Treated, start = c(Vm = 200, K = 0.05), 
           weights = wfct(1/rate))
all(x$weights == 1/Treated$rate)
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Probleme bei Try in Verbindung mit gewichteter nlsLM

Beitrag von schubbiaschwilli »

Gude!

Danke für deine Mühe und Antwort. Ich fürchte nur, das mich das nicht weiterbringt, da x$weights ja nur die bereits vorher als Parameter in die nlsLM-Funktion eingegebenen Werte bzw. Gewichte zurückliefert. Und es ist nicht die gleiche Rechnung und liefert auch unterschiedliche Ergebnisse, also:

x <- nlsLM(rate ~ Vm * conc/(K + conc), data = Treated, start = c(Vm = 200, K = 0.05), weights = wfct(1/rate))
y <- nlsLM(rate ~ Vm * conc/(K + conc), data = Treated, start = c(Vm = 200, K = 0.05))

Tatsächlich get es ja um die Koeffizienten, die R berechnet, und mit denen ich weiterarbeite, also:

coef(x)
coef(y)

Aber vielleicht mache ich mit dem Try was falsch. Ich hab' auch mal TryCatch ausprobiert (mit dem gleichen Ergebnis), und bin halt kein R-Entwickler, ich benutze R als reines Tool zum Rechnen. Wie bereits erwähnt, hängt dahinter eine Datenbank mit den Werten/Daten zum Fitten und unterschiedlichen Startparametern. Ich lasse nlsLM je nach Datensatz ein paar hundert mal laufen, da nlsLM nur ein lokales, vom Startwert abhängiges Minimum liefert; ich suche aber ein globales Minimum, und ich hoffe, dass ich durch dieses Netz von Startwerten das globale Minimum finde (das Kriterium ist hier der Wert 'residual sum-of-squares').
Ich suche jetzt aber nicht unbedingt eine tolle mathematische Lösung, es reicht mir, wenn ich den Code zum Laufen bekomme - Sei es durch einen Workaround oder vielleicht gibt es irgendwo irgendwelche Einstellungen, oderoderoder...

Dank&Gruß
Schubbiaschwilli
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Probleme bei Try in Verbindung mit gewichteter nlsLM

Beitrag von EDi »

Sorry, hab mich wohl leider nicht verständlich ausgedrückt, ich meinte so hier:

Code: Alles auswählen

library(minpack.lm)
Treated <- Puromycin[Puromycin$state == "treated", ]
y <- nlsLM(rate ~ Vm * conc/(K + conc), data = Treated, start = c(Vm = 200, K = 0.05), 
           weights = wfct(1/rate))
try(x <- nlsLM(rate ~ Vm * conc/(K + conc), data = Treated, start = c(Vm = 200, K = 0.05), 
           weights = 1/Treated$rate))
identical(coef(x), coef(y))
Warum das Problem auftaucht? - vermutlich ein "Scoping" Problem (also wie R Werte die zu einem Namen gehören findet. Tut es nämlich in dem Fall nicht, da die Funktion innerhalb von try aufgerufen wird und somit in einem anderen Enviroment...). Ich persönlich tue mir aber bisher relativ schwer damit Environments in R gescheit zu verstehen :(
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Probleme bei Try in Verbindung mit gewichteter nlsLM

Beitrag von schubbiaschwilli »

Gude!

Ich hatte es schon gestern Abend ausprobiert und eingebaut, und es läuft - Zumindest technisch, am Wochenende werd' ich mal ein paar Ergebnisse nachrechnen (nur der Sicherheit halber - nein, ich leide nicht unter Verfolgungswahn) - Danke! Ich hatte mich jetzt auf die Doku mit dem "wfct(1/rate)" verlassen, aber es scheint wie immer, es sind nur Empfehlungen.

Dank&Gruß
schubbiaschwilli
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Probleme bei Try in Verbindung mit gewichteter nlsLM

Beitrag von EDi »

Code: Alles auswählen

Ich hatte mich jetzt auf die Doku mit dem "wfct(1/rate)" verlassen, aber es scheint wie immer, es sind nur Empfehlungen.
Würde ich so nicht sagen.
Du verwendest die Funktion nicht standardgemäß (wrap in try()), für die es sicherlich nicht getestet wurde.
Aber ja, wenn ich mir den Quellcode anschauen, sieht die Funktion nicht so nice programmiert aus... Ist aber auch ein nicht-trivial Sache...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Antworten