【问题标题】:Nonlinear total least squares/Deming regression非线性总最小二乘/戴明回归
【发布时间】:2015-05-17 05:51:49
【问题描述】:

我一直在使用 nls() 将自定义模型拟合到我的数据中,但我不喜欢模型的拟合方式,我想使用一种方法来最小化 x 轴和 y 轴上的残差。

我进行了大量搜索,找到了适合 linear 模型的解决方案,例如 deming 包 (http://cran.r-project.org/web/packages/deming/index.html) 和这些 stackoverflow 帖子:Total Least Square method using RHow to calculate Total least squares in R? (Orthogonal regression)。我还找到了 matlab 解决方案 (https://stats.stackexchange.com/questions/110772/total-least-squares-curve-fit-problem),但这些解决方案适合二阶多项式,而不是自定义的用户定义模型。

我想要的是类似于 nls() 的东西,它可以最小化 x 和 y 残差。这将允许我输入我的自定义模型。有人知道 R 中的任何解决方案吗?

非常感谢!

编辑

这是一个示例,但请注意,我正在寻求有关非线性总最小二乘回归的一般解决方案的建议,而不是针对该数据集的特定内容(这只是基于 Modifying a curve to prevent singular gradient matrix at initial parameter estimates 的示例数据):

df <- structure(list(x = c(3, 4, 5, 6, 7, 8, 9, 10, 11), y = c(1.0385, 
1.0195, 1.0176, 1.01, 1.009, 1.0079, 1.0068, 1.0099, 1.0038)), .Names = c("x", 
"y"), row.names = c(NA, -9L), class = "data.frame")

(nlsfit <- nls(y ~ a^b^x, data = df, start = c(a=0.9, b=0.6)))

library(ggplot2)
ggplot(df, aes(x=x, y=y)) + 
    geom_point() + 
    geom_smooth(method="nls", formula = y ~ a^b^x, se=F, start = list(a=0.9, b=0.6))

【问题讨论】:

  • 投反对票的不是我,但问题至少应该显示您尝试过的代码和输入数据。
  • 感谢 G. Grothendieck!我添加了一个非线性回归的例子。仍然想知道是否有人知道非线性 TLS 类似物。谢谢!
  • 可能是 PCA 回归?主成分最小化从拟合线到任何给定点的正交距离。 cerebralmastication.com/wp-content/uploads/2010/09/pca.png 。我认为您可能被否决了,因为您的问题比 stackoverflow 更适合交叉验证(stats.stackexchange.com
  • 感谢 bjoseph,感谢您的反馈。将在那里发布我的问题。另外,我在搜索过程中确实遇到了 PCA 回归,但想知道这是否仅适用于线性情况(不是非线性情况?)。谢谢!
  • 目前尚不完全清楚如何知道特定答案是否是您想要的,但似乎第一点具有很高的杠杆作用,因此可能相对于您想要的结果扭曲了拟合。如果您的曲线通常具有高杠杆点,那么您可以使用稳健的拟合方法:library(robustbase); nlrob(y ~ a^b^x, df, start = coef(nlsfit), method = "tau", lower = c(a = 0, b = 0), upper = 2)。对于正交最小二乘,您可以尝试使用 onls 包,但我不太确定这是否会提供与问题中显示的完全不同的拟合。

标签: r regression


【解决方案1】:

G. CrossValidated 的 Grothendieck 和 Brian Borchers 建议使用 onls 包,这正是我想要的。谢谢大家,非常感谢您的帮助。请参阅此处了解更多信息:http://www.r-bloggers.com/introducing-orthogonal-nonlinear-least-squares-regression-in-r/

这是一个使用上面相同数据的示例 - 这给出了与常规 nls() 相同的拟合参数,但它确实对我的真实数据产生了影响。但这至少说明了如何进行操作。

df <- structure(list(x = c(3, 4, 5, 6, 7, 8, 9, 10, 11), y = c(1.0385, 
1.0195, 1.0176, 1.01, 1.009, 1.0079, 1.0068, 1.0099, 1.0038)), .Names = c("x", 
"y"), row.names = c(NA, -9L), class = "data.frame")

library(onls)
(onlsfit <- onls(y ~ a^b^x, data = df, start = c(a=0.9, b=0.6)))

# define function containing onls fitted parameters for plotting
fit.model <- function(x) {1.0934^0.7242^x}

library(ggplot2)
ggplot(df, aes(x=x, y=y)) + 
    geom_point() + 
    stat_function(fun=fit.model, color="black")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多