拟合对数正态分布或泊松分布

Sil*_*via 2 r normal-distribution poisson model-fitting data-fitting

我有一个包含 1096 个数字的向量,这是一个测量站 3 年内测量的 NOx 的日平均浓度。您可以观察图像中的分布类型:

NOx 浓度直方图

我使用这些命令来做直方图:

NOxV<-scan("NOx_Vt15-17.txt")
hist.NOxVt<-hist(NOxV, plot = FALSE, breaks = 24) 
plot(hist.NOxVt, xlab = "[NOx]", ylab = "Frequenze assolute", main = "Istogramma freq. ass. NOx 15-17 Viterbo")
points(hist.NOxVt$mids, hist.NOxVt$counts, col= "red")
Run Code Online (Sandbox Code Playgroud)

我的教授建议我用泊松分布拟合直方图 - 注意转换:离散 -> 连续(我不知道这意味着什么) - 或“对数正态”分布。

我尝试使用她在课程中给我们的一些命令行来进行泊松拟合,但是在执行以下最后一行代码后,R 给了我一个错误:

  my_poisson = function(params, x){
      exp(-params)*params^x/factorial(x)
  }

  y<-hist.NOxVt$counts/1096;
  x<-hist.NOxVt$mids;
  z <- nls( y ~ exp(-a)*a^x/factorial(x), start=list(a=1) )
Run Code Online (Sandbox Code Playgroud)

numericDeriv(form[[3L]], names(ind), env) 中的错误:评估模型时产生的缺失值或无穷大此外:有 50 个或更多警告(使用警告()查看前 50 个)”

这个问题解决不了(在网上搜索类似问题)我决定用对数正态拟合分布,但我不知道怎么做,因为教授没有给我们解释,我仍然没有足够的 R 经验来自己解决。

我将不胜感激有关如何进行对数正态拟合和/或泊松拟合的任何建议或示例。

Ben*_*ker 5

R 附带fitdistrMASS包中有一个内置函数:

生成要查看的数据示例(注视参数以获得与您的图片类似的内容):

set.seed(101)
z <- rlnorm(1096,meanlog=4.5,sdlog=0.8)
Run Code Online (Sandbox Code Playgroud)

拟合(基于统计,我不推荐泊松拟合 - 可能可以采用离散分布,如泊松(或更好的负二项式)来拟合这样的连续数据,但对数正态分布或伽玛分布是更自然的选择.

library(MASS)
f1 <- fitdistr(z,"lognormal")
f2 <- fitdistr(z,"Gamma")
Run Code Online (Sandbox Code Playgroud)

f1f2的目的,在打印时,得到的估计系数(meanlogsdlog为对数正态,shaperate用于伽马)和系数的标准误差。

画一张图(在密度标度上,而不是计数标度上):红色是对数正态,蓝色是伽玛(在这种情况下,对数正态更适合,因为这就是我首先生成“数据”的方式)。[该with(as.list(coef(...))东西是一些ř装饰性,以允许使用的名称的系数(的meanlogsdlog在随后的R代码等)。]

hist(z,col="gray",breaks=50,freq=FALSE)
with(as.list(coef(f1)),
     curve(dlnorm(x,meanlog,sdlog),
           add=TRUE,col="red",lwd=2))
with(as.list(coef(f2)),
     curve(dgamma(x,shape=shape,rate=rate),
           add=TRUE,col="blue",lwd=2))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明