[英]Fitting a lognormal or poisson distribution
我有一个1096数字的向量,这是在一个测量站中3年内测得的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")
f1
和f2
对象在打印时会给出估计的系数(对数正meanlog
和sdlog
,伽玛的shape
和rate
)和系数的标准误差。
绘制一张图片(以密度标尺,而不是计数标尺):红色是对数正态,蓝色是Gamma(在这种情况下,对数正态更适合,因为这是我首先生成“数据”的方式)。 [ with(as.list(coef(...))
东西是R的meanlog
, sdlog
在后续的R代码中使用系数名称 ( meanlog
, sdlog
等)。]
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.