在R中,如何对一组数据获得最佳拟合方程?

5
我不确定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))

但是据我所了解,您无法提取公式,请参见Loess Fit and Resulting Equation

当我尝试自己构建时(请注意,我不是数学家,因此这可能不是理想的方法:-)),我最终得到了以下结果:

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

这似乎有点类似,但我认为可能存在更优雅的方法:

我觉得拟合线性或多项式模型也不行,因为公式与这些模型通常使用的不同(即这个公式似乎需要除法、幂等运算等)。例如,在Fitting polynomial model to data in R中的方法给出的逼近结果很糟糕。

我记得很久以前有一种语言(Matlab可能是其中之一?)可以做这种事情。R能否也做到这一点,还是我在错误的地方?

(背景信息:基本上,我们需要找到一个方程来确定第二列数字,根据第一列数字;但我们自己决定这些数字。我们有一个想法,知道曲线应该看起来像什么,但如果我们得到更好的拟合结果,我们可以调整这些数字以获得一个方程。这是关于产品定价的事情(一种比当前昂贵的定性数据分析软件更便宜的替代品);你购买的“项目积分”越多,价格就越便宜。与强制人们购买固定数量(如5或10或25)不同,最好有一个公式,这样人们就可以根据需要购买所需数量。但是,这当然需要一个公式。我们有一些价格的想法,认为它们还不错,但现在我们需要将它们转化为方程。


1
我相信你正在尝试错误的方法。通常,你会从科学(化学、物理等)中寻找一个模型,然后再尝试去适应它。你必须选择想要尝试的模型子集,因为可能存在无限数量的可能模型。 - Roland
感谢您的回复,@Roland!我现在不从事科学(也就是说,不是这个时候:-)) - 我只需要一个方程式来更加“简洁地”描述数据集,而不是列出所有数据点。我会在问题中进一步解释,也许那会有所帮助! - Matherion
2个回答

4

多元线性回归示例

fit <- lm(y ~ x1 + x2 + x3, data=mydata) #使用最小二乘法拟合数据

summary(fit) #显示结果

上面的代码应该会给出使用OLS拟合数据的最佳线条。


谢谢@Philq02!如果我想找到线性模型的最佳拟合,那将非常有帮助。不幸的是,我想要一般情况下的最佳拟合;而且看起来最佳拟合包含一个除法(例如a/X + b * X,其中需要估计a * b)。嘿 - 这给了我一个想法 - 也许我可以使用OLS并提供1/X作为预测变量之一。我会立即去尝试一下,然后回报 :-) 再次感谢您!!! - Matherion
我已经尝试过这个方法(我添加了df$div_x = 1/df$xdf$x_sq = df$x^2,然后运行了fit <- lm(y ~ x + div_x + x_sq, data=df),得到了一个不错的近似结果,所以这绝对是一种改进,谢谢!我会再保持一段时间,以防还有其他更好的方法,但再次感谢! - Matherion

4
我的常规建议: http://creativemachines.cornell.edu/eureqa
但是,如Roland所说,“一般最佳拟合”几乎没有意义,因为任何函数都可以表示为泰勒级数。由于数据集中预计存在噪声(即值的误差),因此曲线拟合的一个重要部分是确定什么是噪声和什么不是噪声。
如果你随意选择某些拟合函数,我能几乎保证外推点会迅速发散。

哇,@Carl,这太棒了!这正是我需要的!感谢您的建议。您当然是正确的。但是,如额外的背景信息中可能(或可能不)清楚地表明的那样,我的目标是插值而不是外推。此外,Eureqa允许我尝试不同的方程式,以便我可以探索外推。所以再次感谢!很抱歉,因为这是我的第一篇帖子,我无法投票支持您的答案... - Matherion
(如果有人在意/感兴趣的话:当仅考虑 x <- c(1, 5, 10, 100);y <- c(100, 75, 50, 25); 这两个数组,并将它们输入 Eureqa 中,它生成的方程之一是 y.predicted <- 100/x^.3;,这给出了相当不错的拟合结果 - 至少对我的目的来说足够好了。再次感谢大家!我希望其他遇到类似问题的人能够找到这个页面 :-)) - Matherion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接