2017-02-02 6 views
1

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)) 
+0

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

+0

Btw., Warum verwenden Sie eine Schleife anstelle der vektorisierten Operation 'xdataratio <- xdata/-59'? – Roland

+0

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

Antwort

0

Dies ist der endgültige Arbeitscode. Das Problem war, mit den Daten in neue (ich nicht gleiche Art von Daten verwendet wurde)

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)) 

Wie @Roland hingewiesen, diese Handlung scheint besser:

plot(distance ~ ratio, pch=19, data=data) 
curve(predict(fit, newdata = data.frame(ratio = x)), add=TRUE) 
+1

Plotten ist einfacher mit 'plot (ydata ~ xdata, pch = 19, data = data); Kurve (vorherzusagen (fit, newdata = data.frame (xdata = x)), add = TRUE) '. (Beachten Sie, dass dies die transformierten 'Daten $ xdata' darstellt und in der Tat' Daten' auch 'ydata' enthalten sollten.) – Roland

+0

Großartig! Genau das wollte ich! : D – Eylen

Verwandte Themen