繁体   English   中英

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

[英]Fitting a lognormal or poisson distribution

我有一个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")

我的教授建议我使用Poisson分布拟合直方图-注意过渡:离散->连续(我不知道那是什么意思)-或使用“对数正态”分布。

我尝试用她在课程中给我们的一些命令行来拟合泊松,但是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) )

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

解决了这个问题之后,我无法解决(甚至在互联网上搜索类似的问题),我决定将分布分配为对数正态分布,但是我不知道该怎么做,因为教授没有向我们解释它,而且我仍然没有足够的R经验自己解决。

我将对如何进行对数正态拟合和/或泊松拟合的任何建议或示例表示赞赏。

R附带的MASS软件包中有一个内置函数fitdistr

生成一个数据示例进行查看(通过目测参数获得与您的图片相似的内容):

set.seed(101)
z <- rlnorm(1096,meanlog=4.5,sdlog=0.8)

拟合(出于统计原因,我不建议进行泊松拟合-可能可以采用离散分布(例如泊松分布(或更好的是负二项式))来拟合此类连续数据,但是对数正态分布或伽玛分布是更自然的选择。

library(MASS)
f1 <- fitdistr(z,"lognormal")
f2 <- fitdistr(z,"Gamma")

f1f2对象在打印时会给出估计的系数(对数正meanlogsdlog ,伽玛的shaperate )和系数的标准误差。

绘制一张图片(以密度标尺,而不是计数标尺):红色是对数正态,蓝色是Gamma(在这种情况下,对数正态更适合,因为这是我首先生成“数据”的方式)。 [ with(as.list(coef(...))东西是R的meanlogsdlog在后续的R代码中使用系数名称meanlogsdlog等)。]

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))

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM