使用直方图进行比较

问题描述 投票:0回答:1

我有一个发行版

f(x) = ((3/2)/(1+x)^2)

并且我使用逆采样方法根据分布f(x)模拟值。

采样步骤是找到f(x)的累积分布函数cdf,然后计算从[0,1]采样的均匀随机值的逆。

我发现CDF为(3x)/2(x+1),我的采样代码为

U <- runif(1000,0,1) # select a random value from the uniform [0,1]
X = ((3/2)*U/(1-(3/2)*U)) #find the inverse cdf for the selected value U

模拟值将根据密度f(x)进行分布。

现在,我想绘制模拟数据的直方图,然后使用函数curve()在直方图上绘制在[0,2]上定义的密度函数f(x)

 f <- function(x) { ((3/2)/(1+x)^2) } #to define the density function f(x)
 hist(X, breaks= 50, freq=T,plot = TRUE)

然后我应该使用函数在曲线上添加曲线

curve(......, add=TRUE)

但是我的问题

  1. 我不知道如何以非常简单和基本的方式定义函数的范围

  2. 得到的直方图看起来很奇怪

编辑:

第二个问题现在已经解决,感谢MrFlick的帮助。关于第一个问题,我如何使用函数curve()在直方图上添加密度函数f(x)图。我在定义密度域时遇到困难。感谢您的帮助。

r probability sampling inverse-transform
1个回答
-1
投票

它应该像这样工作:

set.seed(1111)
U <- runif(1000,0,1) # select a random value from the uniform [0,1]
X = ((3/2)*U/(1-(3/2)*U)) #find the inverse cdf for the selected value U

f <- function(x) { ((3/2)/(1+x)^2) } #to define the density function f(x)

在对hist的调用中,您需要设置freq = FALSE(并在ylim上进行很多操作);在调用curve时,您需要添加add = TRUE,否则曲线将开始新的绘图:

hist(X, breaks= 50, freq = F, plot = T, ylim = c(0, 0.015))
curve(f, add = T, col = "blue")

由于曲线是一条密度线,为什么不使用R的density函数?在这里,我将其与kernel = cosine和一个很大的带宽一起使用;当然可以修改这些参数:

lines(density(X, kernel = "cosine", bw = 50), col = "red")

结果enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.