我有一个发行版
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)
但是我的问题
我不知道如何以非常简单和基本的方式定义函数的范围
得到的直方图看起来很奇怪
编辑:
第二个问题现在已经解决,感谢MrFlick的帮助。关于第一个问题,我如何使用函数curve()
在直方图上添加密度函数f(x)
图。我在定义密度域时遇到困难。感谢您的帮助。
它应该像这样工作:
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")