我尝试在r中创建一个均匀分布函数
fx_uniforme <- function(x,a,b) {
Fx <- 0
for (i in 0:x) {
Fx <- Fx + (a:(b-a+1))/(b-a+1)
}
return(Fx)
}
uniforme_sim <- function(F,...) {
x <- 0
u <- runif(1)
while (F(x, ...) < u) {
x <- x + 1
}
return(x)
}
uniforme_sim(fx_uniforme,1,10)
m <- 1000
a <- 1
b <- 10
Ya <- array(NA, dim = m)
for (i in 1:m) {
Ya[i] <- uniforme_sim(fx_uniforme,a,b)
}
Ya
barplot(table(Ya))
当我绘图时,不是从1到10,而是从0到9。我该怎么做才能解决这个问题?
这可以通过在uniforme_sim
函数中用return(1 + x)
代替return(x)
来解决。
另外,我认为您希望fx_uniforme
函数中的Fx <- Fx + 1/(b-a+1)
消除警告"条件具有长度"。">
更重要的是,您需要认识到R将每个变量存储为向量,并且大多数函数都将在向量上工作。然后利用它来消除这里所有的循环。
你可以用:
m <- 1000
a <- 1
b <- 10
Ya <- sample(a:b, m, replace = TRUE)
barplot(table(Ya))