我需要从混合分布中生成样本

  • 40%样本来自高斯(mean = 2,sd = 8)
  • 20%的样本来自柯西(location = 25,scale = 2)
  • 40%样本来自高斯(平均值= 10,sd = 6)

  • 为此,我编写了以下函数:
    dmix <- function(x){
    prob <- (0.4 * dnorm(x,mean=2,sd=8)) + (0.2 * dcauchy(x,location=25,scale=2)) + (0.4 * dnorm(x,mean=10,sd=6))
    return (prob)
    }
    

    然后用:
    foo = seq(-5,5,by = 0.01)
    vector = NULL
    for (i in 1:1000){
    vector[i] <- dmix(foo[i])
    }
    hist(vector)
    

    我正在得到这样的直方图(我知道这是错误的)-

    我究竟做错了什么?有人可以指点一下吗?

    最佳答案

    当然,还有其他方法可以执行此操作,但是 distr 软件包使其变得非常简单。 (See also this answer的另一个示例,以及有关,分散的和 friend 的更多详细信息)。

    library(distr)
    
    ## Construct the distribution object.
    myMix <- UnivarMixingDistribution(Norm(mean=2, sd=8),
                                      Cauchy(location=25, scale=2),
                                      Norm(mean=10, sd=6),
                                      mixCoeff=c(0.4, 0.2, 0.4))
    ## ... and then a function for sampling random variates from it
    rmyMix <- r(myMix)
    
    ## Sample a million random variates, and plot (part of) their histogram
    x <- rmyMix(1e6)
    hist(x[x>-100 & x<100], breaks=100, col="grey", main="")
    

    如果您只想直接查看混合物分布的pdf,请执行以下操作:
    plot(myMix, to.draw.arg="d")
    

    关于r - R : function to generate a mixture distribution,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23480529/

    10-13 02:58