R中的非线性最小二乘拟合预测



我试图用nls和一些基本数据获得一些系数,以便能够在距离上转换rssi。

到目前为止,我已经能够从"nls"函数中获得拟合,但我无法使用"predict"函数来查看拟合是否正确。也许我只是误解了什么。。。。

这是我的代码:

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

但是,在最后一行,我得到了一个逻辑错误:

xy.cords(x,y,xlabel,ylabel,log)错误:"x"one_answers"y"长度不同

问题是,预测函数只返回8个结果,而新的$xdata的长度为200。在这种情况下使用或理解预测函数有什么帮助吗?

编辑:我已经按照建议把代码改成了这个(也许我理解错了…)。现在的问题是预测总是返回NAN值。

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

工作

这是最后的工作代码。问题是新中的数据(我没有使用相同类型的数据)

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

这是最后的工作代码。问题是新中的数据(我没有使用相同类型的数据)

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

正如@Roland所指出的,这个情节似乎更好:

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

最新更新