拟合R中的累积分布后,根据拟合参数创建正态分布

拟合R中的累积分布后,根据拟合参数创建正态分布,r,math,statistics,curve-fitting,normal-distribution,R,Math,Statistics,Curve Fitting,Normal Distribution,使用Gompertz函数成功拟合累积数据后,我需要从拟合函数创建正态分布 这是迄今为止的代码: df <- data.frame(x = c(0.01,0.011482,0.013183,0.015136,0.017378,0.019953,0.022909,0.026303,0.0302,0.034674,0.039811,0.045709,0.052481,0.060256,0.069183,0.079433,0.091201,0.104713,0.120226,0.138

使用Gompertz函数成功拟合累积数据后,我需要从拟合函数创建正态分布

这是迄今为止的代码:

      df <- data.frame(x = c(0.01,0.011482,0.013183,0.015136,0.017378,0.019953,0.022909,0.026303,0.0302,0.034674,0.039811,0.045709,0.052481,0.060256,0.069183,0.079433,0.091201,0.104713,0.120226,0.138038,0.158489,0.18197,0.20893,0.239883,0.275423,0.316228,0.363078,0.416869,0.47863,0.549541,0.630957,0.724436,0.831764,0.954993,1.096478,1.258925,1.44544,1.659587,1.905461,2.187762,2.511886,2.884031,3.311311,3.801894,4.365158,5.011872,5.754399,6.606934,7.585776,8.709636,10,11.481536,13.182567,15.135612,17.378008,19.952623,22.908677,26.30268,30.199517,34.673685,39.810717,45.708819,52.480746,60.255959,69.183097,79.432823,91.201084,104.712855,120.226443,138.038426,158.489319,181.970086,208.929613,239.883292,275.42287,316.227766,363.078055,416.869383,478.630092,549.540874,630.957344,724.43596,831.763771,954.992586,1096.478196),
                 y = c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00044816,0.00127554,0.00221488,0.00324858,0.00438312,0.00559138,0.00686054,0.00817179,0.00950625,0.01085188,0.0122145,0.01362578,0.01514366,0.01684314,0.01880564,0.02109756,0.0237676,0.02683182,0.03030649,0.0342276,0.03874555,0.04418374,0.05119304,0.06076553,0.07437854,0.09380666,0.12115065,0.15836926,0.20712933,0.26822017,0.34131335,0.42465413,0.51503564,0.60810697,0.69886817,0.78237651,0.85461023,0.91287236,0.95616228,0.98569093,0.99869001,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999))

library(drc)
fm <- drm(y ~ x, data = df, fct = G.3())

options(scipen = 10) #to avoid scientific notation in x axis

plot(df$x, predict(fm),type = "l", log = "x",col = "blue",
           main = "Cumulative function distribution",xlab = "x", ylab = "y")

points(df,col = "red")

legend("topleft", inset = .05,legend = c("exp","fit")
       ,lty = c(NA,1), col = c("red", "blue"), pch = c(1,NA), lwd=1, bty = "n")


summary(fm)

df我想到了
cumdiff
(因为没有更好的术语)。这本书帮了大忙

编辑 屈服:

附加 要从
拟合函数中获得高斯分布,请执行以下操作:

df$y_pred<-predict(fm)
plot(df$x[-1], Mod(df$y_pred[-length(df$y_pred)]-df$y_pred[-1]), log = "x", 
     type = "b", main="Normal distribution for fitted function", 
     xlab = "x", lab = "y")

df$y_pred虽然您的初衷可能是非参数的,但我建议使用参数估计方法:矩量法,该方法广泛用于此类问题,因为您需要拟合某个参数分布(正态分布)。这个想法很简单,从拟合的累积分布函数,你可以计算平均值(
E1
,在我的代码中)和方差(在我的代码中
SD
的平方),然后问题就解决了,因为正态分布可以完全由平均值和方差决定

df <- data.frame(x=c(0.01,0.011482,0.013183,0.015136,0.017378,0.019953,0.022909,0.026303,0.0302,0.034674,0.039811,0.045709,0.052481,0.060256,0.069183,0.079433,0.091201,0.104713,0.120226,0.138038,0.158489,0.18197,0.20893,0.239883,0.275423,0.316228,0.363078,0.416869,0.47863,0.549541,0.630957,0.724436,0.831764,0.954993,1.096478,1.258925,1.44544,1.659587,1.905461,2.187762,2.511886,2.884031,3.311311,3.801894,4.365158,5.011872,5.754399,6.606934,7.585776,8.709636,10,11.481536,13.182567,15.135612,17.378008,19.952623,22.908677,26.30268,30.199517,34.673685,39.810717,45.708819,52.480746,60.255959,69.183097,79.432823,91.201084,104.712855,120.226443,138.038426,158.489319,181.970086,208.929613,239.883292,275.42287,316.227766,363.078055,416.869383,478.630092,549.540874,630.957344,724.43596,831.763771,954.992586,1096.478196),
                 y=c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00044816,0.00127554,0.00221488,0.00324858,0.00438312,0.00559138,0.00686054,0.00817179,0.00950625,0.01085188,0.0122145,0.01362578,0.01514366,0.01684314,0.01880564,0.02109756,0.0237676,0.02683182,0.03030649,0.0342276,0.03874555,0.04418374,0.05119304,0.06076553,0.07437854,0.09380666,0.12115065,0.15836926,0.20712933,0.26822017,0.34131335,0.42465413,0.51503564,0.60810697,0.69886817,0.78237651,0.85461023,0.91287236,0.95616228,0.98569093,0.99869001,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999))

library(drc)
fm <- drm(y ~ x, data = df, fct = G.3())

options(scipen = 10) #to avoid scientific notation in x axis

plot(df$x, predict(fm),type="l", log = "x",col="blue", main="Cumulative distribution function",xlab="x", ylab="y")

points(df,col="red")

E1 <- sum((df$x[-1] + df$x[-length(df$x)]) / 2 * diff(predict(fm)))
E2 <- sum((df$x[-1] + df$x[-length(df$x)]) ^ 2 / 4 * diff(predict(fm)))
SD <- sqrt(E2 - E1 ^ 2)
points(df$x, pnorm((df$x - E1) / SD), col = "green")

legend("topleft", inset = .05,legend= c("exp","fit","method of moment")
       ,lty = c(NA,1), col = c("red", "blue", "green"), pch = c(1,NA), lwd=1, bty="n")


summary(fm)
编辑:更新了根据
drc
拟合的cdf计算力矩的方法。下面定义的函数
使用连续r.v.
E(X^k)=k*\int X^{k-1}(1-cdf(X))dx的矩公式计算矩估计值
。这些是我能从拟合的cdf得到的最佳估计。当
x
接近零时,拟合不是很好,因为我在评论中讨论了原始数据集中的原因

df <- data.frame(x=c(0.01,0.011482,0.013183,0.015136,0.017378,0.019953,0.022909,0.026303,0.0302,0.034674,0.039811,0.045709,0.052481,0.060256,0.069183,0.079433,0.091201,0.104713,0.120226,0.138038,0.158489,0.18197,0.20893,0.239883,0.275423,0.316228,0.363078,0.416869,0.47863,0.549541,0.630957,0.724436,0.831764,0.954993,1.096478,1.258925,1.44544,1.659587,1.905461,2.187762,2.511886,2.884031,3.311311,3.801894,4.365158,5.011872,5.754399,6.606934,7.585776,8.709636,10,11.481536,13.182567,15.135612,17.378008,19.952623,22.908677,26.30268,30.199517,34.673685,39.810717,45.708819,52.480746,60.255959,69.183097,79.432823,91.201084,104.712855,120.226443,138.038426,158.489319,181.970086,208.929613,239.883292,275.42287,316.227766,363.078055,416.869383,478.630092,549.540874,630.957344,724.43596,831.763771,954.992586,1096.478196),
                 y=c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00044816,0.00127554,0.00221488,0.00324858,0.00438312,0.00559138,0.00686054,0.00817179,0.00950625,0.01085188,0.0122145,0.01362578,0.01514366,0.01684314,0.01880564,0.02109756,0.0237676,0.02683182,0.03030649,0.0342276,0.03874555,0.04418374,0.05119304,0.06076553,0.07437854,0.09380666,0.12115065,0.15836926,0.20712933,0.26822017,0.34131335,0.42465413,0.51503564,0.60810697,0.69886817,0.78237651,0.85461023,0.91287236,0.95616228,0.98569093,0.99869001,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999))

library(drc)
fm <- drm(y ~ x, data = df, fct = G.3())

moment <- function(k){
    f <- function(x){
        x ^ (k - 1) * pmax(0, 1 - predict(fm, data.frame(x = x)))
    }
    k * integrate(f, lower = min(df$x), upper = max(df$x))$value
}

E1 <- moment(1)
E2 <- moment(2)
SD <- sqrt(E2 - E1 ^ 2)

df好的,这是根据我的初始数据集而不是拟合创建法线图的方法。我现在将深入研究,看看如何安装eq。非常感谢!但有没有办法在x轴上绘制x值而不是索引?我试过了,但最后我遇到了一个问题,即
Mod(df$y[-length(df$y)]-df$y[-1])
df$x
…是的。。。我也在想这个。试试
str(fm)
,看看你能不能得到一些信息。毕竟,我对软件包
drc
不太熟悉。现在我不能深入讨论,但我保证我会尽快回复你。你能在哪里管理绘制x值而不是索引值?我尝试过不同的事情,但没有成功。如果没有问题,我会发布这个问题……我想我已经做到了:
绘图(df$x[-1],Mod(df$y[-length(df$y)]-df$y[-1]),log=“x”,type=“b”)
。这给了我一个我想要的输出。谢谢你的这个想法。我将深入研究这一点,看看如何处理矩量法。我有点担心它不能很好地放在图的第一部分(直到x=80)。你知道为什么吗?所以,我试着根据你的瞬间绘制正态分布,起点的不匹配导致了奇怪的正态分布(因为它在第一阶段没有达到0)。这是我使用的代码:
y2@numb我发现问题是因为SD估计太大。这是因为原始的
df$x
在x小的时候是稠密的,而在x大的时候是非常稀疏的,这导致了这个问题。我正在寻找获得更好估计的方法。@numb我估计参数
E1
E2
SD
,尽我所能从已安装的模型中进行估计。你提到的问题稍微缓解了一点,但它仍然存在。如果您使用
drs
拟合数据并使用正态分布重新拟合拟合数据,这种问题似乎是不可避免的,除非您进行一些手动调整。@numb Ok,经过一些详细的调查,我想我找到了问题的根源,它似乎在您的原始数据中。让我解释一下,我们都知道正态分布是对称的,原始数据的中心(其中
y=0.5
)有点接近
x=60
,您可以发现
x
大约是
130
其中
y=0.95
,它的对称点是
x
围绕
-10
,其中
y=0.05
。以上只是一些粗略的估计,但它表明原始数据在远离中心的点上不是对称的,这导致了问题。
## > E1 (mean of fitted normal distribution)
## [1] 65.78474
## > E2 (second moment of fitted normal distribution)
##[1] 5792.767
## > SD (standard deviation of fitted normal distribution)
## [1] 38.27707
## > SD ^ 2 (variance of fitted normal distribution)
## [1] 1465.134
df <- data.frame(x=c(0.01,0.011482,0.013183,0.015136,0.017378,0.019953,0.022909,0.026303,0.0302,0.034674,0.039811,0.045709,0.052481,0.060256,0.069183,0.079433,0.091201,0.104713,0.120226,0.138038,0.158489,0.18197,0.20893,0.239883,0.275423,0.316228,0.363078,0.416869,0.47863,0.549541,0.630957,0.724436,0.831764,0.954993,1.096478,1.258925,1.44544,1.659587,1.905461,2.187762,2.511886,2.884031,3.311311,3.801894,4.365158,5.011872,5.754399,6.606934,7.585776,8.709636,10,11.481536,13.182567,15.135612,17.378008,19.952623,22.908677,26.30268,30.199517,34.673685,39.810717,45.708819,52.480746,60.255959,69.183097,79.432823,91.201084,104.712855,120.226443,138.038426,158.489319,181.970086,208.929613,239.883292,275.42287,316.227766,363.078055,416.869383,478.630092,549.540874,630.957344,724.43596,831.763771,954.992586,1096.478196),
                 y=c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00044816,0.00127554,0.00221488,0.00324858,0.00438312,0.00559138,0.00686054,0.00817179,0.00950625,0.01085188,0.0122145,0.01362578,0.01514366,0.01684314,0.01880564,0.02109756,0.0237676,0.02683182,0.03030649,0.0342276,0.03874555,0.04418374,0.05119304,0.06076553,0.07437854,0.09380666,0.12115065,0.15836926,0.20712933,0.26822017,0.34131335,0.42465413,0.51503564,0.60810697,0.69886817,0.78237651,0.85461023,0.91287236,0.95616228,0.98569093,0.99869001,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999,0.99999999))

library(drc)
fm <- drm(y ~ x, data = df, fct = G.3())

moment <- function(k){
    f <- function(x){
        x ^ (k - 1) * pmax(0, 1 - predict(fm, data.frame(x = x)))
    }
    k * integrate(f, lower = min(df$x), upper = max(df$x))$value
}

E1 <- moment(1)
E2 <- moment(2)
SD <- sqrt(E2 - E1 ^ 2)