我正在尝试运行蒙特卡罗模拟,我想做的部分是重复一个过程,因为一个关键变量变得越来越“离散”(忽略“更离散”的想法基本上没有意义)。
因此,如果x < - rnorm(100),并且范围为(-4,3),我希望能够通过首先将100个观测值“舍入”到1000个区间来使其更加离散(所以值等于间隔的中间,然后是500,然后是100等,直到它是'二进制',只有2个间隔。
例如,这是一个丑陋(低效)双循环的样子:
n = 1000
x <- rnorm(n)
k = 20
points <- seq(from = min(x), to = max(x), length.out = k)
for(i in 1:n){
for(j in 1:k){
if(x[i] < points[j]){
x[i] <- mean(c(points[j], points[j-1]))
break
}
}
}
我尝试了'cut',以及'apply'/'sapply'的多种不同变体,但没有任何东西能给我我想要的东西。上面的循环工作正常,但需要永远。如果我想模拟收敛等,这可能会持续数周,具体取决于设置。
对我可能的任何帮助
答案 0 :(得分:1)
cut()
应该适用于这类工作,但这是一种使用sapply
的方法 - 循环:
#dummy data
set.seed(1234)
n = 1000
x <- rnorm(n)
#Discretize a continuous variable
z <-
sapply(c(100,10,5,3), function(k){
sapply(1:length(x), function(i){
points <- seq(from = min(x), to = max(x), length.out = k)
mean(c(points[which(x[i]>points)][1],
points[which(x[i]<points)][1]))
})
})
#plot hist
par(mfrow=c(2,2))
hist(z[,1])
hist(z[,2])
hist(z[,3])
hist(z[,4])
答案 1 :(得分:1)
对于这类工作,请使用效率很高的findInterval
。
我试试:
((points[-k]+points[-1])/2)[findInterval(x,points)]
首先,您使用下一个值评估point
的每个值的平均值。然后将相应的平均值分配给x
值占用的区间。