Как в R получить наиболее подходящее уравнение для набора данных?

Я не уверен, что R может это сделать (я предполагаю, что может, но, может быть, это просто потому, что я склонен предполагать, что R может делать что угодно :-)). Мне нужно найти наиболее подходящее уравнение для описания набора данных.

Например, если у вас есть эти точки:

df = data.frame(x = c(1, 5, 10, 25, 50, 100), y = c(100, 75, 50, 40, 30, 25))

Как получить наиболее подходящее уравнение? Я знаю, что вы можете получить наиболее подходящую кривую с помощью:

plot(loess(df$y ~ df$x))

Но, как я понял, вы не можете извлечь уравнение, см. Подгонка лесса и результирующее уравнение .

Когда я пытаюсь построить его сам (обратите внимание, я не математик, так что это, вероятно, не идеальный подход :-)), я получаю что-то вроде:

y.predicted = 12.71 + ( 95 / (( (1 + df$x) ^ .5 ) / 1.3))

Какой вид, кажется, приближается к нему, но я не могу не думать, что, вероятно, существует что-то более элегантное :-)

У меня такое ощущение, что подбор линейной или полиномиальной модели также не сработает, потому что формула кажется отличной от той, которую обычно используют эти модели (т. Например, подход в Подгонка полиномиальной модели к данным в R дает довольно плохие приближения.

Я помню давно, что существуют языки (Matlab может быть одним из них?), которые делают такие вещи. Может ли R сделать это, или я просто не в том месте?

(Общая информация: в основном нам нужно найти уравнение для определения чисел во втором столбце на основе чисел в первом столбце, но мы сами определяем числа. У нас есть представление о том, как мы хотим, чтобы кривая выглядела. как, но мы можем скорректировать эти числа в уравнение, если мы получим лучшее соответствие. Речь идет о цене продукта (более дешевая альтернатива дорогому программному обеспечению для качественного анализа данных); чем больше «проектных кредитов» вы покупаете, тем дешевле вместо того, чтобы заставлять людей покупать определенное количество (т.е. 5, 10 или 25), было бы лучше иметь формулу, чтобы люди могли покупать именно то, что им нужно, но, конечно, для этого нужна формула. идея для некоторых цен, которые мы считаем приемлемыми, но теперь нам нужно перевести это в уравнение.


person Matherion    schedule 11.10.2012    source источник
comment
Я считаю, что вы пытаетесь сделать это неправильно. Обычно вы ищете модель в науке (химия, физика, ...), а затем пытаетесь ее подогнать. Вы должны выбрать подмножество моделей, которые хотите попробовать, поскольку существует бесконечное количество возможных моделей.   -  person Roland    schedule 11.10.2012
comment
Спасибо за вашу реакцию @Roland! Я не занимаюсь наукой (то есть не в этот момент :-)) - мне просто нужно уравнение для более «экономного» описания набора данных, чем перечисление всех точек данных. Я объясню немного больше в вопросе, может быть, это поможет!   -  person Matherion    schedule 11.10.2012


Ответы (2)


Мой обычный плагин: http://creativemachines.cornell.edu/eureqa

Но, как сказал Роланд, «наилучшее соответствие вообще» не имеет большого значения, поскольку любую функцию можно выразить в виде ряда Тейлора. Поскольку ожидается, что набор данных будет иметь шум, то есть ошибки в своих значениях, большая часть подбора кривой заключается в определении того, что является шумом, а что нет. большой гарантией является то, что экстраполированные точки будут расходиться в спешке.

person Carl Witthoft    schedule 11.10.2012
comment
Вау, @Карл, это здорово! Это именно то, что мне нужно! Спасибо также за совет. Вы правы, конечно. Однако, как может (а может и нет :-)) стать ясно из дополнительной справочной информации, моей целью является интерполяция, а не экстраполяция. Кроме того, Eureqa позволяет мне играть с различными уравнениями, чтобы я мог исследовать экстраполяцию. Так что еще раз спасибо! Извините, но поскольку это был мой первый пост, я не могу проголосовать за ваш ответ. . . - person Matherion; 11.10.2012
comment
(если кого-то это волнует/интересует: если посмотреть только на пары, для которых x <- c(1, 5, 10, 100); и y <- c(100, 75, 50, 25);, и ввести их в Eureqa, одно из сгенерированных уравнений будет y.predicted <- 100/x^.3;, что дает вполне приличную подгонку - по крайней мере, достаточно для моих целей. Еще раз спасибо всем, я надеюсь, что другие с подобными проблемами наткнутся на эту страницу :-)) - person Matherion; 11.10.2012

Пример множественной линейной регрессии

подгонка ‹- lm(y ~ x1 + x2 + x3, данные = мои данные)

summary(fit) # показать результаты

Приведенный выше код должен дать вам строку, которая лучше всего соответствует вашим данным с использованием OLS.

person philq    schedule 11.10.2012
comment
Спасибо, @Philq02! Это было бы очень полезно, если бы я хотел найти наилучшее соответствие линейной модели. К сожалению, я хочу наилучшего соответствия в целом; и похоже, что наилучшее соответствие содержит деление (например, a/X + b * X, где необходимо оценить a * b). Эй, это наводит меня на мысль - может быть, я могу использовать OLS и предоставить 1/X в качестве одного из предикторов. Я немедленно попробую это, я отчитаюсь :-) Еще раз спасибо!!! - person Matherion; 11.10.2012
comment
Я поиграл с этим (я добавил df$div_x = 1/df$x и df$x_sq = df$x^2, а затем запустил fit <- lm(y ~ x + div_x + x_sq, data=df), что дает нормальное приближение, так что это определенно улучшение, спасибо! Я оставлю это открытым немного больше, если существуют другие (лучшие ) способов, но еще раз спасибо! - person Matherion; 11.10.2012