2017-02-02 13 views
1

Я пытаюсь получить некоторые коэффициенты с 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)) 
+0

Вам нужно (I) положить 'xdataratio' в data.frame, (ii) использовать параметр' data' 'nls' и (iii) использовать то же имя столбца в' new', что и в data.frame, переданном как 'data'. – Roland

+0

Кстати, почему вы используете цикл вместо векторной операции 'xdataratio <- xdata/-59'? – Roland

+0

Не знаю, я мог бы это сделать XD Я только начинаю с R, поэтому ... ожидайте много чего ... Я также попробую другие шаги и дам вам знать – Eylen

ответ

0

Это окончательный рабочий код. Проблема была с данными в новом (я не использовал тот же тип данных)

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

Ссылку проще с помощью 'plot (ydata ~ xdata, pch = 19, data = data); кривая (предсказывать (fit, newdata = data.frame (xdata = x)), add = TRUE) '. (Обратите внимание, что это отображает преобразованные 'данные $ xdata', и даже' data' должен содержать 'ydata' тоже.) – Roland

+0

Отлично! Это именно то, что я хотел! : D – Eylen