2016-05-23 5 views
0

У меня было много вопросов по SO, но я не могу найти исправление для своей проблемы в связанных ответах. У меня есть таблица, как это хранится в PAO1.data:Установите экспоненциальную кривую с использованием nls с пользовательским фреймом данных в R

Name   P   AO 
Prog1  0.654  59.702 
Prog2  0.149  49.595 
Prog3  0.505  50.538 
Prog4  0.777  59.954 
Prog5  0.237  49.611 
Prog6  0.756  50.630 
Prog7  0.560  118.014 
Prog8  0.015  53.779 
Prog9  0.789  68.096 
Prog10  0.825  79.558 

Я пытался использовать NLS, чтобы соответствовать экспонент к данным.

df = data.frame(PAO1.data) 
p = df$P 
ao = df$AO 
RMSE <- function(fit, act){ 
    sqrt(mean((fit - act)^2)) 
} 

expmodel = nls(formula = p ~ exp(ao), data = df, start = list(ao = 0.01)) 
fit1 = fitted.values(expmodel) 
err1 = RMSE(fit1, p) 
plot(ao, p) 
lines(ao, predict(expmodel)) 
print(err1) 

Когда я пытаюсь запустить его, я получаю эти предупреждающие сообщения при создании expmodel:

Warning messages: 
1: In min(x) : no non-missing arguments to min; returning Inf 
2: In max(x) : no non-missing arguments to max; returning -Inf 

В то же время, я получаю эту ошибку в lines():

Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
Calls: lines -> lines.default -> plot.xy -> xy.coords 

другой вопрос, который я прочитал на SO с ошибкой «длина отличается», фактически имел разную длину в x и y. Однако мои x и y (здесь ao и p) имеют точно такое же количество значений.

Обратите внимание, что вряд ли экспоненциальная кривая на самом деле будет хорошей подгонкой, но я попробую несколько разных моделей, и я хочу знать, как правильно использовать nls, поэтому я могу сделать то же самое с другими моделями.

Некоторые связанные кривой облегающие вопросы:

This question говорит о том, что начиная с данных является ключевым. Наименьшее значение для АО в моей таблице составляет 0,015, и я выбрал 0,01, что, по-моему, достаточно близко. This question спрашивает о nls, а ответ задается с использованием полинома с использованием lm. Мне особенно нужно знать, как использовать nls для множества сложных моделей в будущем, и это не сработает для меня. This question выглядел многообещающим, но я не могу найти проблему в своем коде, посмотрев на этот вопрос и ответ - у меня тоже есть аналогичные заявления в моем коде.

Как это сделать?

Edit:

Вот скриншоты решений размещены в комментариях Роланд: (Фактический набор данных больше)

После изменения вызова НЛС в expmodel = nls(formula = p ~ exp(beta * ao), data = df, start = list(beta = 0.01))

After changing the call to nls

После сортировки значений АО с lines(sort(ao), predict(expmodel))

After sorting the AO values

+0

Исправьте свой вызов модели 'expmodel = nls (formula = P ~ exp (beta * AO), data = df, start = list (beta = 0.01))'. Вы не понимаете, как указаны формулы для 'nls'. Вы также можете рассмотреть возможность создания самонаступающей модели (поиск Google для 'SSexp'). – Roland

+0

Спасибо, я сделал то, что вы сказали, и удалил ошибку «линии, отличающиеся», но полученный график - это огромный беспорядок прямых линий, а не экспоненциальная кривая. Позже я посмотрю в 'SSexp', но знаю, как исправить эту новую проблему? – Kajal

+0

Вам нужно заказать значения y и x для графика, чтобы значения x увеличивались. – Roland

ответ

1
df <- read.table(text = "Name   P   AO 
Prog1  0.654  59.702 
       Prog2  0.149  49.595 
       Prog3  0.505  50.538 
       Prog4  0.777  59.954 
       Prog5  0.237  49.611 
       Prog6  0.756  50.630 
       Prog7  0.560  118.014 
       Prog8  0.015  53.779 
       Prog9  0.789  68.096 
       Prog10  0.825  79.558", header = TRUE) 

#use correct syntax: 
expmodel = nls(formula = P ~ exp(beta * AO), data = df, start = list(beta = 0.01)) 

plot(P ~ AO, data = df) 
#you could use lines after sorting, but this is more convenient: 
curve(predict(expmodel, newdata = data.frame(AO = x)), from = 49, to = 120, add = TRUE) 

resulting plot

Очевидно, что это не очень хорошая модель для ваших данных. Как вы знаете, экспоненциальная функция проходит через (0,1). Вы должны рассмотреть возможность добавления перехвата.

+0

Мой фактический набор данных намного больше, поэтому я изменил первую часть кода, чтобы обратиться к моей фактической таблице. Остальное остается прежним. Однако я не вижу никакой линии на сюжете, созданного - это странно, я попробую сделать его цвет другим и посмотреть, что произойдет. – Kajal

+0

Я изменил его на красный, добавив 'col =" red "' в линию кривых, но все еще не видно ни одной строки. Я понятия не имею, что здесь происходит. Я только изменил набор данных – Kajal

+0

Вы настроили значения 'from' и' to'? – Roland