【问题标题】:MASS packages' "fitdistr": Error when dealing with manipulated random dataMASS 包的“fitdistr”:处理操纵的随机数据时出错
【发布时间】:2017-04-25 03:58:07
【问题描述】:

背景:

在下面,我使用 R 生成了一些随机 beta 数据,并稍微操纵数据的形状以达到我所说的 "Final" 在我的代码中。我在我的代码中直方图 "Final"

问题:

我想知道为什么在尝试使用 MASS 包的“fitdistr”函数将“beta”分发版拟合到 Final 数据时,我得到了跟随错误(有什么建议可以避免这个错误)?

Error in stats::optim(x = c(0.461379379270288, 0.0694261016478062, 0.76934266883081, : initial value in 'vmmin' is not finite

这是我的 R 代码:

 require(MASS)

## Generate some data and manipulate it
set.seed(47)

Initial = rbeta(1e5, 2, 3)
d <- density(Initial)

b.5 <- dbeta(seq(0, 1, length.out = length(d$y)), 50, 50)
b.5 <- b.5 / (max(b.5) / max(d$y))    # Scale down to max of original density

 b.6 <- dbeta(seq(0, 1, length.out = length(d$y)), 60, 40)
 b.6 <- b.6 / (max(b.6) / max(d$y))

 # Collect maximum densities at each x to use as sample probability weights
 p <- pmax(d$y, b.5, b.6)


Final <- sample(d$x, 1e4, replace = TRUE, prob = p) ## THIS IS MY FINAL DATA

hist(Final, freq = F, ylim = c(0, 2))               ## HERE IS A HISTOGRAM

 m <- MASS::fitdistr(Final, "beta",          ## RUN THIS TO SEE HOW THE ERROR COMES UP
                start = list(shape1 = 1, shape2 = 1))

【问题讨论】:

  • 是不是因为你的Final中有负值? beta 不应该被限制在 0 到 1 之间吗?将这些值更改为大于零的最小Final 值怎么样?
  • @din,我怎样才能摆脱最小值?顺便说一句,即使我将 Final 再次更改为以下内容,fitdistr 也会出现相同的错误:Final = c(rbeta(1e5, 2, 3), rep(0, 0), rep(.1, 1500), rep(.2, 1900), rep(.3, 2100), rep(0.5,1500), rep(0.6,1800) , rep(.9, 2), rep(.9, 1), rep(1, 1) )
  • 这个怎么样:Final[Final&lt;= 0] &lt;- min(Final[Final&gt;0]);应该用大于 0 的最小值替换小于或等于 0 的值。但它确实给出了一些警告信息。使用 fitdist 时,您输入给它的值似乎应该在 0 和 1 之间(给出 0 仍然会引发一些错误)。
  • @din, Final[Final&lt;= 0] &lt;- min(Final[Final&gt;0]) 没用。给出糟糕的直方图。试试看。
  • 什么样的直方图不好?它确实适用于我的机器。给出了一个直方图,将第一个 bin(包含与第二个 bin 的负值)合并。然后给出这个最优参数shape1 1.99240852 (0.02649853)shape2 2.90219720 (0.04010168)。如果你愿意,我会在答案中发布直方图。

标签: r distribution bayesian empirical-distribution


【解决方案1】:

这是代码。

你的代码也是这样,我只是去掉了负的 beta 值。

library(MASS)

set.seed(47)

Initial = rbeta(1e5, 2, 3)
d <- density(Initial)

b.5 <- dbeta(seq(0, 1, length.out = length(d$y)), 50, 50)


b.5 <- b.5 / (max(b.5) / max(d$y))    # Scale down to max of original 
density

b.6 <- dbeta(seq(0, 1, length.out = length(d$y)), 60, 40)
b.6 <- b.6 / (max(b.6) / max(d$y))

# Collect maximum densities at each x to use as sample probability weights
p <- pmax(d$y, b.5, b.6)


Final <- sample(d$x, 1e4, replace = TRUE, prob = p) ## THIS IS MY FINAL DATA

hist(Final, freq = F, ylim = c(0, 2))               ## HERE IS A HISTOGRAM

# replace negative beta values with smallest value > 0
Final[Final<= 0] <- min(Final[Final>0])

hist(Final, freq = F, ylim = c(0, 2))

m <- MASS::fitdistr(x = Final, densfun = "beta",          
                start = list(shape1 = 1, shape2 = 1))

以下是形状参数:

> m
     shape1       shape2  
  1.99240852   2.90219720 
 (0.02649853) (0.04010168)

请注意,它会给出一些警告。

【讨论】:

  • din,谢谢,我接受了,但是以下不起作用的原因如何:Initial = c(rbeta(1e5, 2, 3), rep(0, 0), rep(.1, 1500), rep(.2, 1900), rep(.3, 2100), rep(0.5,1500), rep(0.6,1800) , rep(.9, 2), rep(.9, 1), rep(1, 1) ); hist(Initial, breaks = 30, freq = F) 并使用 MASS 以这种方式查看相同的错误:m &lt;- MASS::fitdistr(Initial, dbeta, start = list(shape1 = 1, shape2 = 1))
  • 尝试删除 `rep(0,0) 中的零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 2020-12-02
  • 2015-10-20
  • 1970-01-01
相关资源
最近更新 更多