R nls: подгонка кривой к данным

Мне не удается найти правильную кривую, подходящую для моих данных. Если у кого-то более знающего, чем я, есть идея / решение для лучшей подгонки кривой, я был бы очень благодарен.

Данные: цель состоит в том, чтобы предсказать x из y

dat <- data.frame(x = c(15,25,50,100,150,200,300,400,500,700,850,1000,1500),
                  y = c(43,45.16,47.41,53.74,59.66,65.19,76.4,86.12,92.97,
                        103.15,106.34,108.21,113) ) 

Вот как далеко я зашел:

model <- nls(x ~ a * exp( (log(2) / b ) * y),
             data = dat, start = list(a = 1, b = 15 ), trace = T)

Что не очень подходит:

dat$pred <- predict(model, list(y = dat$y))
plot( dat$y, dat$x, type = 'o', lty = 2)
points( dat$y, dat$pred, type = 'o', col = 'red')

подходящий сюжет

Спасибо, F


r nls
person Fabian_G    schedule 02.11.2015    source источник
comment
В функции plot в R первый аргумент - это x аргумент, а второй аргумент - это y. Вы нанесли dat$x на ось y. Возможно, вы захотите это исправить.   -  person narendra-choudhary    schedule 02.11.2015
comment
Для некоторых вещей я считаю Excel более интуитивным, чем R - например ... вы могли бы подогнать линию тренда в Excel, вы бы увидели, что полиномиальная функция более высокой степени подходит, и, наконец, вы, вероятно, приземлились бы здесь.   -  person lukeA    schedule 02.11.2015


Ответы (1)


Предсказание x от y полиномом 5-й степени не так уж экономно, но, похоже, подходит:

fm <- lm(x ~ poly(y, 5), dat)
plot(x ~ y, dat)
lines(fitted(fm) ~ y, dat)

(продолжение после сюжета)

скриншот

Вы также можете рассмотреть модель UCRS.5b пакета drc:

library(drc)
fm <- drm(x ~ y, data = dat, fct = UCRS.5b())
plot(fm)

скриншот

Примечание. Первоначально я предполагал, что вы хотите предсказать y по x, и написал ответ ниже.

Довольно неплохо смотрится кубик:

plot(y ~ x, dat)
fm <- lm(y ~ poly(x, 3), dat)
lines(fitted(fm) ~ x, dat)

(продолжение после сюжета)

скриншот

Также неплохо выглядит логистика из 4 параметров:

library(drc)
fm <- drm(y ~ x, data = dat, fct = LL.4())
plot(fm)

скриншот

person G. Grothendieck    schedule 02.11.2015
comment
Спасибо ! Кубик действительно выглядит неплохо. Но он предсказывает y от x, я хочу предсказать x от y. - person Fabian_G; 02.11.2015
comment
Простите за плохую, использовал drm вместо пакета drc - person Fabian_G; 02.11.2015
comment
P.S Я не знаком с пакетом drc. Вы знаете, как получить предсказанные значения x? Спасибо! - person Fabian_G; 02.11.2015
comment
methods(class = "drc") покажет различные методы, доступные для "drc" объектов. - person G. Grothendieck; 02.11.2015