【问题标题】:R obtaining a probability distributionR获得概率分布
【发布时间】:2012-06-30 01:31:14
【问题描述】:

我有一段关系: y = a + b + c

我有a、b和c的平均值和标准差 我想获得 y 的概率分布 通过蒙特卡洛模拟。

有没有我可以使用的功能或包或简单的方法来做到这一点?

【问题讨论】:

    标签: r


    【解决方案1】:

    我假设您假设您的输入 a、b 和 c 是正态分布的,因为您说您可以使用均值和标准差来定义它们。如果是这种情况,您无需任何特殊软件包即可快速完成此操作。

     mu.a=33
     mu.b=32
     mu.c=13
     sigma.a=22
     sigma.b=22
     sigma.c=222
    
    n= a.large.number=10^5
    a=rnorm(n,mu.a,sigma.a)
    b=rnorm(n,mu.b,sigma.b)
    c=rnorm(n,mu.c,sigma.c)
    y=a+b+c
    plot(density(y))
    mean(y)
    sd(y)
    

    请务必了解我们对yabc 所做的所有假设。 如果你想做一些更复杂的事情,比如计算 y 平均值的抽样方差。然后多次执行此过程,收集平均值并绘制它。

    mysimfun=function(n,mu,sigma,stat.you.want='mean') 
       #  mu is length 3 and sigma is too.
    
    {
    n= a.large.number=10^5
        a=rnorm(n,mu[1],sigma[1])
        b=rnorm(n,mu[2],sigma[2])
        c=rnorm(n,mu[3],sigma[3])
        y=a+b+c
        plot(density(y))
    
    
    return(ifelse(stat.you.want=='mean',mean(y),sd(y))
    }
    
    
    mu=c(mu.a,my.b,mu.c)
    sigma=c(sigma.a,sigma.b,sigma.c)
    mi=rep(NA,100)
    

    然后在某种循环中运行它。

    for(i in 1:100) {mi[i]=mysimfun(10,mu,sigma,stat.you.want='mean') }
    
    par(mfrow=c(2,1)
    hist(mi)
    plot(density(mi))
    
    mean(mi)
    sd(mi)
    

    【讨论】:

    • 太好了。非常感谢。
    【解决方案2】:

    有两种方法:我认为引导,我认为这可能是 MonteCarlo 的意思,或者如果您对理论比从经验分布构造估计值更感兴趣,“distr”包及其朋友“distrSim”和“distrTEst” ”。

    require(boot)
    ax <- rnorm(100); bx<-runif(100); cx<- rexp(100)
    dat <- data.frame(ax=ax,bx=bx,cx=cx)
    
    boot(dat, function(d){ with(d, mean(ax+bx+cx) )}, R=1000,  sim="parametric")
    boot(dat, function(d){ with(d, sd(ax+bx+cx) )}, R=1000,  sim="parametric")
    

    【讨论】: