【问题标题】:In R, how do you get the best fitting equation to a set of data?在 R 中,如何获得一组数据的最佳拟合方程?
【发布时间】:2012-10-01 21:25:18
【问题描述】:

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

哪一种似乎是近似的——但我不禁想到可能存在更优雅的smth :-)

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

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

(背景信息:基本上,我们需要做的是根据第一列中的数字找到一个确定第二列中数字的方程式;但我们自己决定数字。我们知道我们想要曲线看起来像,但如果我们得到更好的拟合,我们可以将这些数字调整为一个等式。它是关于产品的定价(比当前昂贵的定性数据分析软件更便宜的替代品);您购买的“项目信用”越多,它应该变得越便宜。与其强迫人们购买给定的数字(即 5 或 10 或 25),不如有一个公式,这样人们就可以准确地购买他们需要的东西——但这当然需要一个公式。我们对一些我们认为合适的价格有一个想法,但现在我们需要将其转化为一个等式。

【问题讨论】:

  • 我相信您正试图以错误的方式进行操作。通常,您会从科学(化学、物理……)中寻找模型,然后尝试拟合它。您必须选择要尝试的模型子集,因为可能的模型数不胜数。
  • 感谢您的反应@Roland!我不是在做科学(也就是说,不是这一刻:-)) - 我只需要一个方程来更“简洁”地描述数据集,而不是列出所有数据点。我会在问题中解释更多,也许有帮助!

标签: r equation


【解决方案1】:

我常用的插件:http://creativemachines.cornell.edu/eureqa

但正如 Roland 所说,“最适合一般”没有什么意义,因为任何函数都可以表示为泰勒级数。由于预计一组数据的值会有噪声,也就是错误,因此曲线拟合的很大一部分是确定什么是噪声,什么不是。
如果你任意选择一些拟合函数,我可以保证的一件事是外推点会很快发散。

【讨论】:

  • 哇@Carl,这太棒了!这正是我需要的!也谢谢你的建议。你当然是对的。然而,在额外的背景信息中可能(或可能不会:-))变得清晰,我的目标是插值而不是外推。此外,Eureqa 允许我使用不同的方程,以便我可以探索外推。再次感谢您!很抱歉,但因为这是我的第一篇文章,我不能投票给你的答案。 . .
  • (如果有人关心/感兴趣:当只查看 x <- c(1, 5, 10, 100);y <- c(100, 75, 50, 25); 的对并将它们输入 Eureqa 时,它生成的方程之一是 y.predicted <- 100/x^.3;,它非常合适 - 至少对我的目的来说已经足够了。再次感谢大家!我希望其他有类似问题的人偶然发现这个页面:-))
【解决方案2】:

多元线性回归示例

适合

summary(fit) # 显示结果

上面的代码应该为您提供最适合使用 OLS 的数据的行。

【讨论】:

  • 谢谢@Philq02!如果我想找到线性模型的最佳拟合,那将非常有帮助。可悲的是,我想要总体上最合适的;并且看起来最佳拟合包含一个除法(例如 a/X + b * X,其中 a * b 需要估计)。嘿 - 这给了我一个想法 - 也许我可以使用 OLS 并提供 1/X 作为预测变量之一。我马上去试试,我会回来报告的:-)再次谢谢你!!!
  • 我玩过这个(我添加了df$div_x = 1/df$xdf$x_sq = df$x^2,然后运行fit <- lm(y ~ x + div_x + x_sq, data=df),这给出了一个好的近似值,所以这绝对是一个改进,谢谢!我'如果存在其他(更好的)方法,我会保持开放,但再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多