我有大量的高频风资料。我用这个数据在一个模型中计算了大气和水之间的气体交换。我使用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)然后,我在风矢量的平均值和sd周围创建了100个值:
df <- as.data.frame(mapply(rnorm,mean=mean(wind),sd=sd(wind),n=100))标准差产生负值。如果这些运行在气体交换模型中,我会得到不成比例的大误差,因为风速不可能是负的,而且模型的构造不能运行负风测量。有人建议我对原始数据进行日志转换,并使用已记录的值运行rnorm(),然后再进行转换。但是由于数据中有几个零(0=no风),我不能简单地记录这些值。因此,我使用了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,因此可以进行日志转换。
发布于 2021-02-10 19:45:20
建议:使用零充气/更改模型,在模型中生成一部分零值,然后从日志正态分布中提取其余的值(以确保没有得到负值):
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所建议的),或者拟合一个截尾模型来估计被测量为零的风值的分布(假设风速永远不是零,只是太小而无法测量)。
https://stackoverflow.com/questions/66143722
复制相似问题