'离散'一个连续的变量 - 但不是'分解'它

时间:2015-06-02 07:50:40

标签: r simulation

我正在尝试运行蒙特卡罗模拟,我想做的部分是重复一个过程,因为一个关键变量变得越来越“离散”(忽略“更离散”的想法基本上没有意义)。

因此,如果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'的多种不同变体,但没有任何东西能给我我想要的东西。上面的循环工作正常,但需要永远。如果我想模拟收敛等,这可能会持续数周,具体取决于设置。

对我可能的任何帮助

2 个答案:

答案 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])

enter image description here

答案 1 :(得分:1)

对于这类工作,请使用效率很高的findInterval

我试试:

((points[-k]+points[-1])/2)[findInterval(x,points)]

首先,您使用下一个值评估point的每个值的平均值。然后将相应的平均值分配给x值占用的区间。