我正在尝试使用 nls 和一些基本数据获得一些系数,以便能够在距离上转换 rssi。
到目前为止,我已经能够从“nls”函数中获得拟合,但我无法使用“预测”函数来查看拟合是否正确。也许我只是误会了什么......
这是我的代码:
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.coords(x, y, xlabel, ylabel, log) 中的错误:“x”和“y”长度不同
问题是 predict 函数只返回 8 个结果,而 new$xdata 的长度为 200。在这种情况下使用或理解 predict 函数有什么帮助吗?
编辑: 我已按照建议将代码更改为此(也许我理解错了..)。现在的问题是预测总是返回 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))