首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从r范数函数中消除模拟数据中的零点

如何从r范数函数中消除模拟数据中的零点
EN

Stack Overflow用户
提问于 2021-02-10 19:28:09
回答 1查看 69关注 0票数 0

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

代码语言:javascript
复制
#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个值:

代码语言:javascript
复制
df <- as.data.frame(mapply(rnorm,mean=mean(wind),sd=sd(wind),n=100))

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

代码语言:javascript
复制
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,因此可以进行日志转换。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-10 19:45:20

建议:使用零充气/更改模型,在模型中生成一部分零值,然后从日志正态分布中提取其余的值(以确保没有得到负值):

代码语言:javascript
复制
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所建议的),或者拟合一个截尾模型来估计被测量为零的风值的分布(假设风速永远不是零,只是太小而无法测量)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66143722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档