我有以下经验数据集:
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 <- function(x) 5743.492/(x^1.6)
:
KS
0.234651
xmin
625
pars
1.6
尽管如此,我想要一个模拟从x点1.731开始的行为的模型。因此,查看日志日志图表中没有适合这些点的行,我认为应该排除幂律分布。
我一直在试验威布尔回归,但没有成功。
任何人都可以了解一下最好的模型,以及如何在R中做到这一点?
答案 0 :(得分:2)
我的倾向是将模型仅适用于x > 1.7
的数据,因为这是感兴趣的范围。事实上,查看数据的简单图表显示y在x=1.73
开始时,它始终为10000,当它开始迅速下降时。这让我想知道y(x < 1.7)
是否有意义。你曾经用什么测量y剪辑x < 1.7
??
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