2017-05-31 2 views
0

Ich erstelle eine logistische Funktion, "Spaß", die mehrere Parameter berechnet, dh: SOS, EOS, LOS, SPUDOY und P_Tamplitude, mit einer .envi-Raster-Datei . Letztendlich möchte ich separate Diagramme für jeden Parameter erstellen.Eingabe einer Funktion, die eine Liste in calc() zurückliefert R

Ich benutze Calc(), um "Spaß" auf Data_value durchzuführen. Es funktioniert, wenn "Spaß" nur eine Variable zurückgibt. Calc() schlägt jedoch fehl, wenn "Spaß" alle fünf oben erwähnten Parameter zurückgibt - was eine Liste ist.

new <- stack("1982_test.envi") 
new[new<=-1000]<-0 
Data_value<-new/10000 
DOY<-(1:nlayers(new)*15) 

fun<- function(x) { if (all(is.na(x[1]))) { return (NA) } else { 
fitForThisData <-nls(x~ a+((b/(1+ exp(-c*(DOY-e))))- (g/(1+ exp(-d*(DOY- 
f))))), alg="port",start=list(a=0.1,b=1,g=1,c=0.04,d=0.04,e=112,f=218), 
lower=list(a=0,b=0.3,g=0.3,c=-1,d=-1,e=20,f=100), 
upper=list(a=0.4,b=2,g=2,c=1,d=1,e=230,f=365), 
control=nls.control(maxiter=2000, tol = 1e-15, minFactor = 1/1024, 
warnOnly=TRUE)) 
SOS<-(coef(fitForThisData)[6] -(4.562/(2*coef(fitForThisData)[4]))) 
EOS<-(coef(fitForThisData)[7] -(4.562/(2*coef(fitForThisData)[5]))) 
LOS<-(EOS-SOS) 
SPUDOY<-(1.317*((-1/coef(fitForThisData)[4])+ coef(fitForThisData)[6])) 
P_TAmplitude<-(SPUDOY-SOS) 
return (c(SOS,EOS,LOS,SPUDOY,P_TAmplitude)) 
} 
} 

equation<-calc(Data_value,fun) 

Nach dem Ausführen des obigen Befehls wird ein Fehler angezeigt. Fehler in setValues ​​(out, x): Werte müssen numerisch, integer, logische oder Faktor sein

plot(equation) 

Jede Art von Hilfe würde geschätzt. Vielen Dank!

+0

FWIW, 'fun' kehrt nicht eine Liste, sondern ein Vektor. Haben Sie das Argument "forceapply = TRUE" von "? Calc" berücksichtigt? –

+0

Ich denke, Vektor ist eine Liste. Es ist nur ein anderer Jargon in R. (http://www.r-tutor.com/r-introduction/vector). – Candice

+0

@ RomanLuštrik Ich habe gerade R. abgeholt. Verzeihen Sie, wenn ich falsch liege, aber ich denke, Vektor ist eine Liste. Es ist nur ein anderer Jargon in R. (http://www.r-tutor.com/r-introduction/vector). Ich versuchte mit Forceapply = TRUE in Calc(), ich habe den gleichen Fehler als auch. Ich denke auch über die Verwendung von Sapply, aber ich denke nicht, dass es für Raster-Daten funktioniert. Ich denke auch, dass ich vielleicht die Werte in Matrix anstelle von einer Liste zurückgeben kann. Ich möchte 5 Schichten von Daten erzeugen (SOS, EOS, LOS, SPUDOY und P_TAmplitude) und calc() ausführen. Ich denke R versteht nicht, wie die Daten gespeichert werden sollen. Gedanken? – Candice

Antwort

0

Ich habe Ihren Code mit einigen Beispieldaten versucht und es funktioniert tatsächlich, wenn ich keine NA-Werte einfüge. Es scheint ein Problem mit der Anzahl der von Ihnen zurückgegebenen NA-Werte zu bestehen. Die Länge für den Fall, dass eine NA auftritt, muss gleich sein, wenn keine NA auftritt. In Ihrem Fall ist es jedoch 1 und 5

Versuchen Sie, die folgende Zeile zu ändern:

return(NA) 

zu

return(rep(NA,5)) 
+0

Es zeigt mir jetzt fünf Plots mit dem kleinen Tweak, den du vorgeschlagen hast! Vielen Dank! @maRtin – Candice

+0

Gern geschehen! Ich würde eine Aufzählung schätzen, wenn Sie meine Antwort hilfreich fanden. @Candice – maRtin

Verwandte Themen