如何从 rnorm 函数中消除模拟数据中的零

How to eliminate zeros in simulated data from rnorm function

我有一大套风的高频数据。我在模型中使用这些数据来计算大气和水之间的气体交换。我使用 10 天系列测量的平均风来表示给定时间的气体交换。由于风是 10 天系列的平均值,我想通过将误差添加到输入来将误差应用到输出:

#fictional time series, manually created by me.
wind <- c(0,0,0,0,0,4,3,2,4,3,2,0,0,1,0,0,0,0,1,1,4,5,4,3,2,1,0,0,0,0,0)

然后我围绕风矢量的均值和标准差创建 100 个值:

df <- as.data.frame(mapply(rnorm,mean=mean(wind),sd=sd(wind),n=100))

标准偏差产生负值。如果在气体交换模型中这些是 运行,我会得到不成比例的大误差,这仅仅是因为风速不能为负,并且该模型的构造不能够 运行 进行负风测量。我被建议记录转换原始数据和 运行 具有记录值的 rnorm(),然后转换回来。但是由于数据中有几个零(0=无风),我不能简单地记录这些值。因此我使用 log(x+c) 方法:

wind.log <- log(wind+1)  
df.log <-  as.data.frame(mapply(rnorm,
            mean=mean(wind.log),
            sd=sd(wind.log),n=100))                

但是,在模型中 运行 之前,我需要将值转换回实际的风测量值。 这就是问题所在,因为我需要使用 exp(x)-c 将值转换回来,然后我再次得到负值。

有没有一种方法可以解决这个问题,而不需要 运行 将 0 加进去并搞砸生成的均值分布?

我唯一的选择是在每个给定时间点直接计算气体交换并从中生成分布,这些值永远不会为负或 = 0,因此可以进行对数转换。

建议:使用 zero-inflated/altered 模型,在其中生成一定比例的零值并从对数正态分布中提取其余部分(以确保不会得到负值):

wind <- c(0,0,0,0,0,4,3,2,4,3,2,0,0,1,0,0,0,0,1,1,4,5,4,3,2,1,0,0,0,0,0)
prop_nonzero <- mean(wind>0)
lmean <- mean(log(wind[wind>0]))
lsd <- sd(log(wind[wind>0]))
n <- 500
vals <- rbinom(n, size=1,prob=prop_nonzero)*rlnorm(n,meanlog=lmean,sdlog=lsd)

或者,您可以使用 Tweedie 分布(如@aosmith 所建议),或拟合 censored 模型来估计测量为零的风值分布(假设风速永远不会完全为零,只是太小而无法测量)