Frage:
Interpretation und Fehlerbehebung von nls in R mit quadratischem Plateau-Modell
Freya Womersley
2020-04-08 15:27:21 UTC
view on stackexchange narkive permalink

Ich versuche, ein quadratisches Plateau-Modell für einige Proportionsdaten auszuführen, bei denen Werte zwischen 0 und 100 gebunden sind. Ich möchte Hilfe bei der Fehlerbehebung bei aufgetretenen Fehlern und bei der korrekten Interpretation der Ergebnisse sowie beim Verständnis der Gleichung und der Vorgehensweise schreibe es richtig aus. Wenn jemand Erfahrung mit diesen Modellen hat, wird jede Hilfe sehr geschätzt, da ich gegen eine Wand gestoßen bin.

Beispieldaten:

  Tage Typ Bereich
0 Abrieb 0
11 Abrieb 65.6513749
13 Abrieb 79.1887936
15 Abrieb 88.3947998
26 Abrieb 98.2726653
38 Abrieb 100
0 Abrieb 0
70 Abrieb 93.5047459
124 Abrieb 100
0 Abrieb 0
7 Abrieb 78.2666991
8 Abrieb 78.3624009
9 Abrieb 78.9448106
14 Abrieb 81.6443138
24 Abrieb 97.9969096
29 Abrieb 98.8788699
50 Abrieb 99.4708654
53 Abrieb 100
0 Schnittwunde 0
8 Schnittwunde 8.05965381
22 Schnittwunde 67.1254163
83 Schnittwunde 100
0 Schnittwunde 0
8 Riss 59.1650901
69 Schnittwunde 96.1942307
74 Schnittwunde 100
0 Schnittwunde 0
49 Schnittwunde 82.5396751
133 Schnittwunde 100
0 Schnittwunde 0
125 Schnittwunde 100
0 Schnittwunde 0
16 Schnittwunde 48.5178133
 

X = Tage Y = Fläche

Ich möchte ein quadratisches Plateau-Modell an diese Daten anpassen.

Code, den ich verwende:

  ### Finden Sie vernünftige Anfangswerte für Parameter

fit.lm = lm (Fläche ~ Tage, Daten = Heilung)

a.ini = fit.lm  $ Koeffizienten [1]
b.ini = fit.lm $  span> -Koeffizienten [2]
clx.ini = Mittelwert (Heilung $ Fläche)


### Definieren Sie die quadratische Plateau-Funktion

Quadplat = Funktion (x, a, b, clx) {
  ifelse (x < clx, a + b * x + (-0,5 * b / clx) * x * x,
         a + b * clx + (-0,5 * b / clx) * clx * clx)}

### Best-Fit-Parameter finden


model = nls (Fläche ~ Quadplat (Tage, a, b, clx),
            Daten = Heilung,
            start = list (a = a.ini,
                         b = b.ini,
                         clx = clx.ini),
            trace = FALSE,
nls.control (maxiter = 1000))

Zusammenfassung (Modell)
 

Wenn ich dies für einige Daten ausführe, funktioniert es einwandfrei, aber manchmal erhalte ich den folgenden Fehler:

  Fehler in nls (Bereich ~ Quadplat (Tage, a, b, clx), Daten = Heilung ,:
  singulärer Gradient
 

Ich bin mir nicht sicher, warum ich dies mit einigen Daten und nicht mit anderen erhalte. Wenn ich beispielsweise die Teilmenge Schnittwunde ausführe, läuft das Modell einwandfrei. Modellausgabe:

  Formel: Fläche ~ vierfach (Tage, a, b, clx)

Parameter:
    Schätzung Std. Fehler t Wert Pr (> | t |)
a 1,2304 3,8509 0,320 0,753
b 3,0869 0,5595 5,518 2,54e-05 ***
clx 62.7697 11.0592 5.676 1.80e-05 ***
--- ---.
Signif. Codes: 0 "***" 0,001 "**" 0,01 "*" 0,05 "." 0,1 "" 1

Reststandardfehler: 11,86 bei 19 Freiheitsgraden

Anzahl der Konvergenziterationen: 8
Konvergenztoleranz erreicht: 3.234e-06
 

Ich interpretiere dies als den kritischen Schwellenwert, bei dem es keine statistische Änderung von Y mit einem Anstieg von X von 62,7697 Tagen gibt. Ist das eine korrekte Interpretation?

Diagramm unten:

enter image description here

Für mich sieht diese Handlung gut aus. Wenn ich jedoch dieselbe Analyse mit der Teilmenge Abrieb durchführe, wird der Fehler Singulargradient angezeigt. Warum könnte dies sein, liegt das daran, dass die Daten nicht gut passen?

Bitte kann mir jemand mit nls-Kenntnissen helfen, indem er genau erklärt, was dieses quadratische Modell tut und warum ich möglicherweise einen Fehler erhalte. Ich möchte diese Analyse nicht "Black Box" und ich denke, mir fehlt das Schlüsselverständnis. Wenn jemand da draußen gut darin ist, Formeln zu interpretieren, können Sie mir außerdem helfen, indem Sie diesen Code in eine lesbare Formel schreiben?

  -Funktion (x, a, b, clx) {
  ifelse (x < clx, a + b * x + (-0,5 * b / clx) * x * x,
         a + b * clx + (-0,5 * b / clx) * clx * clx)}
 

Alle Informationen zu dieser Frage sind sehr willkommen oder Hinweise auf gute Ressourcen auf nls.Ich brauche hier wirklich Hilfe und kann bei Bedarf meinen vollständigen Datensatz anhängen.

(+1) (In der Geostatistik ist dies als "sphärisches Variogrammmodell" bekannt.) Seine zweite Ableitung ist diskontinuierlich und seine Parameterschätzungen werden, wie angegeben, sehr stark korreliert: Diese mathematischen Eigenschaften machen es als Modell weniger als wünschenswert.In der Tat passt es nicht gut zu Ihren Beispieldaten, und die Verwendung von "nls" (kleinste Quadrate) zur Anpassung von * Proportionen * ist statistisch nicht geeignet.Eine Lösung wäre also, sowohl Ihr Modell als auch das Anpassungsverfahren zu überdenken, anstatt daran zu arbeiten, dass dieses fehlerfrei ausgeführt wird.Vielleicht sagen Ihnen die Rechenfehler etwas Wichtiges!
Zwei antworten:
G. Grothendieck
2020-04-11 00:08:56 UTC
view on stackexchange narkive permalink

Wir brauchen bessere Startwerte. Passen Sie ein Nicht-Plateau-Modell, model0, an und verwenden Sie die Parameter daraus, um alle Datenpunkte anzupassen, die das Modell ergeben. Verwenden Sie dann a und b daraus und ein Wertegitter für clx (aufgrund seiner Problematik), das model.Ab und model.La. (Beachten Sie, dass es nicht möglich ist, Anpassungen von einigen Startwerten des Rasters zu erzeugen, was zu Fehlermeldungen führt. Nls2 verarbeitet jedoch weiterhin weitere Startwerte, sodass diese Fehler ignoriert werden können.)

  Bibliothek (nls2)

# Stellen Sie sicher, dass die Daten zum Plotten sortiert sind
o <- mit (Heilung, Ordnung (Typ, Tage))
h <-Heilung [o,]

Das letzte Argument # gibt an, ob ein Plateau vorhanden ist oder nicht
Quadplat = Funktion (x, a, b, clx, plat = TRUE) {
  if (plat) x <-pmin (x, clx)
  a + b * x + (-0,5 * b / clx) * x * x
}}

# Kein Plateau-Modell mit allen Daten versehen
st <c (a = 1, b = 1, clx = 1)
model0 <nls (Area ~ quadplat (Tage, a, b, clx, FALSE), h, start = st)

# passt alle Datenmodell
Modell <nls (Fläche ~ Quadplat (Tage, a, b, clx), h, Start = Coef (Modell 0))
co <-coef (Modell)
 

Wir können jetzt die Teilmengenmodelle mithilfe der oben in den Startwerten berechneten Werte anpassen und zeichnen.

  if (existiert ("model.Ab")) rm (model.Ab)
model.Ab <nls2 (Fläche ~ Quadplat (Tage, a, b, clx), h, Teilmenge = h $ Typ == "Abrieb",
  start = data.frame (a = co [[1]], b = co [[2]], clx = 0: 140))

if (existiert ("model.La")) rm (model.La)
model.La <nls2 (Fläche ~ Quadplat (Tage, a, b, clx), h, Teilmenge = h $ Typ == "Schnittwunde",
  start = data.frame (a = co [[1]], b = co [[2]], clx = 0: 140))
  
cols <c (Abrieb = "rot", Schnittwunde = "blau")
Diagramm (Fläche ~ Tage, h, col = cols [Typ], pch = 20, cex = 1,5)
Linien (angepasst (Modell.Ab) ~ Tage, Teilmenge (h, Typ == "Abrieb"),
  col = cols ["Abrieb"])
Linien (angepasst (Modell.La) ~ Tage, Teilmenge (h, Typ == "Schnittwunde"),
  col = cols ["Schnittwunde"])
 

(Fortsetzung nach Grafik) screenshot

Alternatives Modell

Wenn es in Ordnung ist, andere Modelle in Betracht zu ziehen, hat dieses Modell nur zwei Parameter, ist einfacher anzupassen und hat trotz weniger Parameter geringere Restquadratsummen.

  model.Ab2 <nls (Bereich ~ a * (1 - exp (- b * Tage)), h,
   Teilmenge = Typ == "Abrieb", Start = c (a = 100, b = 0,1))
 
model.La2 <nls (Fläche ~ a * (1 - exp (- b * Tage)), h,
   Teilmenge = Typ == "Schnittwunde", Start = c (a = 100, b = 0,1))

# Handlung
cols <c (Abrieb = "rot", Schnittwunde = "blau")
Diagramm (Fläche ~ Tage, h, col = cols [Typ], pch = 20, cex = 1,5)
Linien (angepasst (Modell.Ab2) ~ Tage, Teilmenge (h, Typ == "Abrieb"),
  col = cols ["Abrieb"])
Linien (angepasst (Modell.La2) ~ Tage, Teilmenge (h, Typ == "Schnittwunde"),
  col = cols ["Schnittwunde"])
 

(Fortsetzung nach Grafik) screenshot

Ein Parametermodell

Wenn wir im 2-Parameter-Modell des letzten Abschnitts a = 100 festlegen, erhalten wir ein 1-Parameter-Modell, das statistisch nicht vom 2-Parameter-Modell unterscheidbar ist. Dies geht aus dem in den Anovas gezeigten p-Wert hervor, der größer als 0,05 ist, was darauf hinweist, dass wir die Nullhypothese, dass die 1- und 2-Parametermodelle die Daten für jede der beiden Teilmengen gleich gut beschreiben, nicht ablehnen können.

  model.Ab3 <nls (Fläche ~ 100 * (1 - exp (- b * Tage)), h,
   Teilmenge = Typ == "Abrieb", Start = c (b = .1))
 
model.La3 <nls (Fläche ~ 100 * (1 - exp (- b * Tage)), h,
   Teilmenge = Typ == "Schnittwunde", Start = c (b = 0,1))

anova (model.Ab3, model.Ab2)

anova (model.La3, model.La2)
 

Beachten Sie auch, dass der Punkt, an dem y = 95 erreicht wird, d. h. in der Nähe des Plateaus, -log (1 - 95/100) / b ist (basierend auf der Invertierung der Modellgleichung). Der Zähler ist ungefähr 3, also erreicht er 95 bei ungefähr 3 / b .

Andere

Wenn m <nls (...) ist, gibt die Zusammenfassung (m) Standardfehler von Koeffizienten und anderen Informationen an.

Wow, das ist so hilfreich und du hast mir geholfen, mit etwas voranzukommen, mit dem ich eine Weile wirklich zu kämpfen hatte.Ich danke dir sehr.Es ist möglich, Standardfehler und p-Werte für die ersten von Ihnen vorgeschlagenen Modelle zu generieren.Ich werde auch die zweite betrachten.Wissen Sie, wie ich die quadratische Gleichung, die in der ersten als griechische Formel verwendet wurde, aufschreiben könnte?Nochmals vielen Dank für Ihre Hilfe hier.
Fehler beim Ausschneiden und Einfügen behoben, der zu Unterschieden zwischen Code und Beschreibung führt.Haben auch einen Parameter und andere Abschnitte hinzugefügt, die einige Informationen enthalten, die einige der Fragen in Ihrem Kommentar behandeln.
Wären diese Modelle als Referenz möglich, wenn meine Daten negativ abfallen würden?
Es würde von den tatsächlichen Daten abhängen, aber Sie könnten versuchen, "a * exp (-b * Days)" oder gegebenenfalls a auf 100 zu korrigieren.Versuchen Sie zum Beispiel `Kurve (100 * exp (- .2 * x), 0, 50) `
Eine letzte Frage.Können Sie bei der Gleichung dieses Modells helfen?In dem von Ihnen vorgeschlagenen alternativen Modell und Parametermodell bin ich in der folgenden Gleichung korrekt: y = ae ^ -bx.In diesem Fall, was bedeutet a, da es nicht Y ist, wenn x = 0 ist.
in y = a * exp (-b * x) wenn x = 0, dann ist y = a.
Robert Long
2020-04-11 17:11:05 UTC
view on stackexchange narkive permalink

Wenn jemand da draußen gut darin ist, Formeln zu interpretieren, können Sie mir helfen, indem Sie diesen Code in eine lesbare Formel schreiben?

  -Funktion (x, a, b, clx) {
  ifelse (x < clx, a + b * x + (-0,5 * b / clx) * x * x,
         a + b * clx + (-0,5 * b / clx) * clx * clx)}
 

$$ f (x, a, b, x_ {cl}) = \ begin {Fälle} a + bx + (\ frac {-0,5b} {x_ {cl}}) \ times x ^ 2 , & \ text {if} \ x < x_ {cl} \\ a + bx_ {cl} + (\ frac {-0,5b} {x_ {cl}}) \ times {x_ {cl}} ^ 2 , & \ text {sonst} \ end {Fälle} $$ span>

was vereinfacht zu:

$$ f (x, a, b, x_ {cl}) = \ begin {Fälle} a + bx \ left (1 - \ frac {x} {2x_ {cl}} \ right) , & \ text {if} \ x < x_ {cl} \\ a + \ frac {bx_ {cl}} {2} , & \ text {sonst} \ end {Fälle} $$ span>

wobei ich $ x_ {cl} $ span> durch clx ersetzt habe, um die Lesbarkeit zu verbessern.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 4.0-Lizenz, unter der er vertrieben wird.
Loading...