Я пытаюсь получить некоторые коэффициенты с nls и некоторые базовые данные, чтобы иметь возможность трансформировать rssi на расстоянии.Прогноз от нелинейных наименьших квадратов подходит к R
До сих пор я был в состоянии получить соответствие от функции «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 (х, у, xlabel, ylabel, журнал): «х» и «у» длины которых отличаются
проблема заключается в том, что функция предсказать, возвращается только 8 результатов, в то время как новый $ XData имеет длину 200. Любой хель p об использовании или понимании функции прогнозирования в этом сценарии?
Редактировать: Я изменил код на это, как и предполагалось (возможно, я понял это неправильно ..). Теперь проблема в том, что предсказание всегда возвращает значения 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))
Вам нужно (I) положить 'xdataratio' в data.frame, (ii) использовать параметр' data' 'nls' и (iii) использовать то же имя столбца в' new', что и в data.frame, переданном как 'data'. – Roland
Кстати, почему вы используете цикл вместо векторной операции 'xdataratio <- xdata/-59'? – Roland
Не знаю, я мог бы это сделать XD Я только начинаю с R, поэтому ... ожидайте много чего ... Я также попробую другие шаги и дам вам знать – Eylen