【问题标题】:Curve fitting to empirical data in R曲线拟合到 R 中的经验数据
【发布时间】:2014-01-10 17:54:20
【问题描述】:

我有以下经验数据集:

x<-c(0.5,1,1.5,1.731,1.75,2,2.5,3,3.5,4)

y<-c(10000,10000,10000,10000,5700,2700,1700,1350,950,625)

我一直在尝试将数据拟合到理论上的模型。到目前为止,我已经使用 powerlaw 包将数据拟合到幂律,但仅适用于离散值(x = 1,2,3,4):

通过查看图表,我会说尾部与以下估计参数 power_law_fit &lt;- function(x) 5743.492/(x^1.6) 相当吻合:

KS
0.234651

xmin
625

pars
1.6

尽管如此,我想要一个能够模仿从 x 点 1.731 开始的行为的模型。查看对数对数图,没有适合这些点的线,因此我认为应该排除幂律分布。

我一直在尝试 weibull 回归,但没有成功。

谁能解释一下最好的模型以及如何在 R 中做到这一点?

【问题讨论】:

  • 您是否尝试过使用nls 函数(非线性最小二乘法)?它专为曲线拟合而设计(尽管您必须牢记曲线)
  • 您是否要求数据遵循基础分布?如果不是,那么您可以尝试将 N 次正交多项式拟合到数据中;见poly()。就个人而言,函数似乎可以分段拟合数据 - x 区间 [0.0, 1.731) 上的线性函数和 x 区间 [1.731, Inf) 上的指数函数。
  • 你打算如何处理你的结果?如果您只想预测数据范围内的值,splinefun 是您的最佳选择。

标签: r curve


【解决方案1】:

我倾向于将模型仅拟合x &gt; 1.7 的数据,因为这是感兴趣的范围。事实上,查看您的数据的简单图显示 y 一直保持在 10000,直到 x=1.73 开始迅速下降。这让我想知道y(x &lt; 1.7) 是否有意义。你用什么来测量x &lt; 1.7的y剪辑??

plot(x,y)

使用nls(...) 函数进行非线性建模,并在对函数形式进行大量实验后,模型:

y ~ a/(1 + b*(x*(x-1.73))^n)

非常适合:

df     <- data.frame(x,y)
df.sub <- df[4:10,]

fit    <- nls(y~a/(1+b*(x*(x-1.731))^n),data=df.sub,start=c(a=1000,b=1,n=.5))
summary(fit)
# Formula: y ~ a/(1 + b * (x * (x - 1.731))^n)  
# Parameters:
#    Estimate Std. Error t value Pr(>|t|)    
# a 9.992e+03  1.396e+02   71.58 2.28e-07 ***
# b 3.744e+00  1.769e-01   21.17 2.94e-05 ***
# n 4.762e-01  1.859e-02   25.61 1.38e-05 ***
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 139.8 on 4 degrees of freedom
# ...
library(ggplot2)
ggp <- ggplot(df.sub, aes(x=x,y=predict(fit)))
ggp <- ggp + geom_line(color="blue", linetype=2)
ggp <- ggp + geom_point(color="blue", shape=1, size=3)
ggp <- ggp + geom_point(data=df, aes(y=y), size=3)
ggp

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多