Ich versuche, einige Koeffizienten mit nls und einige grundlegende Daten zu erhalten, um rssi in der Entfernung zu transformieren.Vorhersage von nichtlinearen kleinsten Quadraten Passt in R
Bis jetzt konnte ich die Anpassung von 'nls' Funktion bekommen, aber ich kann nicht die 'Vorhersage' Funktion verwenden, um zu sehen, ob die Anpassung korrekt ist. Vielleicht bin ich Missverständnis nur etwas ....
Das ist mein Code:
ydata = c(0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2)
xdata = c(-57, -57, -60, -65, -66, -68, -70, -73)
xdataratio <- sapply(xdata, function(e){return(e/-59)})
plot(ydata, xdata, pch=19)
p1 = 0.1
p2 = 1
p3 = 1
nlsFunction <- function(x, a, b, c) { a * 10^(b*x + c)}
propModel <- function(rssi, a, b, c) {(log(rssi/a) - c)/b}
powerFunction <- function(x, b0, b1, b2) {b0 + b1*(x^b2)}
fit = nls(ydata ~ powerFunction(xdataratio, p1, p2, p3), start=list(p1=p1, p2=p2, p3=p3))
summary(fit)
new = data.frame(xdata = seq(min(xdata), max(xdata), len=200))
lines(new$xdata, predict(fit, newdata=new))
Aber in der letzten Zeile, erhalte ich einen Logikfehler:
Fehler in xy.coords (x, y, xlabel, ylabel, log): 'x' und 'y' Längen unterscheiden
das Problem ist, dass die vorhersagen Funktion nur 8 Ergebnisse zurückkehrt, während die neue $ xdata der Länge 200 ist. Jede hel Verwenden oder verstehen Sie die Vorhersagefunktion in diesem Szenario?
Bearbeiten: Ich habe den Code zu diesem wie vorgeschlagen geändert (vielleicht habe ich es falsch verstanden ..). Jetzt ist das Problem, dass die Vorhersage immer NAN-Werte zurückgibt.
ydata = c(0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2)
xdata = c(-57, -57, -60, -65, -66, -68, -70, -73)
xdataratio <- xdata/-59
data = data.frame(ydata=ydata, xdata=xdataratio)
plot(ydata, xdata, pch=19)
p1 = 0
p2 = 1
p3 = 2
powerFunction <- function(x, b0, b1, b2) {b0 + b1*(x^b2)}
new = data.frame(xdata = seq(min(xdata), max(xdata), len=200))
fit = nls(ydata ~ powerFunction(xdata, p1, p2, p3), start=list(p1=p1, p2=p2, p3=p3), data=data, trace=T)
lines(new$xdata, predict(fit, newdata=new))
Arbeiten
Dies ist der letzte Arbeitscode. Das Problem war mit den Daten in neu (ich verwendete nicht den gleichen Datentyp)
ydata = c(0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2)
xdata = c(-57, -57, -60, -65, -66, -68, -70, -73)
xdataratio <- xdata/-59 #sapply(xdata, function(e){return(e/-59)})
data = data.frame(xdata=xdataratio)
plot(ydata, xdata, pch=19)
p1 = 0
p2 = 1
p3 = 2
powerFunction <- function(x, b0, b1, b2) {b0 + b1*(x^b2)}
new = data.frame(xdata = seq(min(xdata), max(xdata), len=200)/-59)
fit = nls(ydata ~ powerFunction(xdata, p1, p2, p3), start=list(p1=p1, p2=p2, p3=p3), data=data, trace=T)
summary(fit)
plot(type="lines",new$xdata, predict(fit, newdata=new))
Sie müssen (i) Put- "xdata- ratio" in einen data.frame, (ii) verwende den "data" -Parameter von "nls" und (iii) verwende den gleichen Spaltennamen in "new" wie im data.frame, der als "data" übergeben wird. – Roland
Btw., Warum verwenden Sie eine Schleife anstelle der vektorisierten Operation 'xdataratio <- xdata/-59'? – Roland
Wusste nicht, dass ich das XD tun könnte Ich fange gerade mit R so an ... erwarte viele dieser Dinge ... Ich werde die anderen Schritte auch versuchen und dich wissen lassen – Eylen