У меня было много вопросов по 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))
После сортировки значений АО с lines(sort(ao), predict(expmodel))
Исправьте свой вызов модели 'expmodel = nls (formula = P ~ exp (beta * AO), data = df, start = list (beta = 0.01))'. Вы не понимаете, как указаны формулы для 'nls'. Вы также можете рассмотреть возможность создания самонаступающей модели (поиск Google для 'SSexp'). – Roland
Спасибо, я сделал то, что вы сказали, и удалил ошибку «линии, отличающиеся», но полученный график - это огромный беспорядок прямых линий, а не экспоненциальная кривая. Позже я посмотрю в 'SSexp', но знаю, как исправить эту новую проблему? – Kajal
Вам нужно заказать значения y и x для графика, чтобы значения x увеличивались. – Roland