【问题标题】:How to generate and sample from a random distribution fit to observed values in R?如何从随机分布中生成和采样,以拟合 R 中的观察值?
【发布时间】:2021-03-08 11:48:38
【问题描述】:

我一直在使用包amt 中的现有函数random_steps。我需要从我的数据中生成适合观察值的值的伽马分布,然后从这些值中采样,为我提供观察到的可能的替代方案。问题是观察值的范围是 0 到 53,而生成的值是 0 到 522。显然,该函数给我的值不仅不可信,而且不可能。

我不想通过源代码 (https://github.com/jmsigner/amt/blob/master/R/random_steps.R) 寻找要修复的东西,所以我希望有人能给我一个逃脱的机会,这样我就可以离开 amt。但是,我无法在其他地方找到解决方案。肯定有一种简单的方法可以使用现有值生成分布,然后从中进行抽样?

这些是在数据(左)中观察到的值的密度图,由random_steps(右)生成。

我的数据集有超过 200 万行,这让我无法准确地展示正在发生的事情。基本上代码如下:

stepTime <- 60
toleranceTime <- 15

tracks <- lapply(split(df, df$name), function(x){

# make animal tracks and resample to consistent times
  trk <- mk_track(df, .x=long, .y=lat, .t=timestamp, id = name) %>%
    track_resample(rate = minutes(stepTime),tolerance = minutes(toleranceTime))
  
  # burst steps
  burst <- steps_by_burst(trk, keep_cols = "start")
  
  # create random steps using fitted gamma and von mises distributions and append
  rnd_stps <- burst %>%  random_steps(n_control = stepNumber)
  
}) %>% reduce(rbind)

它会产生 4.03% 的替代值,其中大于最高观察值。

当我按照下面的建议生成一个全新的分布时,我会得到一条非常漂亮的曲线,它完全位于可能值的范围内。 但是,当我从中提取值以创建我的可能值样本以与观察到的值进行比较时,下端的密度非常高,以至于所有采样值都低于 1。我的观察值范围从 0 到 53而我的选择范围从 0 到 1。

关于如何获得更接近现实的分布的任何提示?

非常感谢!

【问题讨论】:

  • 采样时值高于 53 的频率如何?您能否发布一个可重现的示例,其中包含观察值和采样值的密度图。

标签: r


【解决方案1】:

我不熟悉random_steps,但将伽马分布拟合到一组观察值并不难。这是一种方法。

如果 gamma 分布根据尺度和形状参数进行参数化,则均值由 shape * scale 给出,方差由 shape * scale * scale 给出。因此,计算样本的均值和方差,并将尺度导出为方差/均值,因此形状 = 均值/尺度。详情请见here

这是一个有效的例子。

library(tidyverse)

# Generate some gamma data
set.seed(123)
d <- tibble(x = rgamma(1000, shape=3, scale=1.5)) 

# Calculate summary statistics
stats <- d %>% summarise(Mean=mean(x), Variance=var(x))
stats
# A tibble: 1 x 2
   Mean Variance
  <dbl>    <dbl>
1  4.32     5.65

# Derive parameter estimates
scale <- stats$Variance / stats$Mean
shape <-  stats$Mean / scale

> scale
[1] 1.307148
> shape
[1] 3.305911

# Derive fitted PDF and compare with empirical PDF
fitted <- tibble(x=seq(0,15,0.25), y=dgamma(x, shape=shape, scale=scale))
d %>% ggplot + geom_histogram(aes(x=x, y=..density..), bins=20) + geom_line(data=fitted, aes(x=x, y=y), colour="blue")

如果您的观察数据与拟合分布之间仍有显着差异,则表明您的观察不遵循伽马分布。

【讨论】:

  • FWIW 这被称为“矩方法”
  • 确实如此,本。
猜你喜欢
  • 2019-02-12
  • 2013-07-29
  • 2019-09-19
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多