0

我最近使用这里建议的方法模拟了我的数据。在考虑舍入规则时,我可以寻找可能的(真实)值。我有5条规则:

  1. 精确数字四舍五入为 1%;
  2. 四舍五入到 5% 的倍数;
  3. 四舍五入到 10% 的倍数;
  4. 四舍五入到 25% 的倍数;
  5. 四舍五入到 50% 点的倍数。

所以 If g_mY = 25,它可能是对范围内的数字进行四舍五入的结果,以最接近的 25 ( )[12.5, 37.5)的倍数四舍五入。如果四舍五入到最接近的 5 倍数,range = g_mY-12.5, g_mY+12.5它也可能来自范围,如果我们有一个精确的数字,它甚至可能来自范围。[22.5, 27.5)[24.5,25.5)

所以现在,我想通过比上一个主题更不可知论来重新模拟我的数据:Yt在范围内生成随机数(潜在变量)[0, 100],然后使用舍入规则来模拟g_mY

你会怎么做?你会从哪里开始?

非常感谢。

编辑:我试过这个,但代码似乎不优雅:

#include <oxstd.h>
#include <oxprob.h>


decl g_mX, g_mY;

simuldata(const ct) { //  ct : number of observations

    decl agex ;
    decl age = new matrix [ct][1];
        for (decl i = 0; i < ct; ++i) {
            do { //#1
            agex = 19 + ranindex(ct, 61)';
            }  while (agex <= 19);
            age[i][] = agex ;
    }
    decl sex = ranbinomial(ct, 1, 1, 0.468) ;
    decl mx = sex ~ age;   // predictors

    g_mX = mx[][0:1] ; // regressors: Gender, Age.
    
    decl vp = < .0485434; -.006764; -.5094531 ; -.2441042  ;  .6912481 ;   1.11204>;
    
    decl veps = 30 + 70*ranu(ct, 1);
    decl Yt = floor(g_mX*vp[:1] + veps) + 0.5;

    g_mY = new matrix[rows(g_mX)][1] ;  // dependent variable
      for (decl i = 0; i < rows(g_mX); ++i) {
        if(Yt[i]+0.5 .!= (imod(Yt[i], 5)==0))      //Rounding to 1 points +/- 0.5 points
            {
            g_mY[i] = Yt[i]+0.5 ;
            }
            
        else if(Yt[i]-0.5 .!= (imod(Yt[i], 5)==0))
            {
            g_mY[i] = Yt[i]-0.5 ;
            }

         
        else if(Yt[i]+2.5 .== range(5, 100, 5)')       //Rounding to 5 points +/- 2.5 points
            {
            g_mY[i] = Yt[i]+2.5 ;
            }
            
        else if(Yt[i]-2.5 .== range(5, 100, 5)')
            {
            g_mY[i] = Yt[i]-2.5 ;
            }
            
    
        else if(Yt[i]+5 .== range(5, 100, 5)')     //Rounding to 10 points +/- 5 points
            {
            g_mY[i] = Yt[i]+5 ; 
            }
        else if(Yt[i]-5 .== range(5, 100, 5)')
            {
            g_mY[i] = Yt[i]-5 ;
            }
            
    
        else if(Yt[i]+12.5 .== range(0, 100, 25)')     //Rounding to 25 points +/- 12.5 points
            {
            g_mY[i] = Yt[i]+12.5 ;  
            }
        else if(Yt[i]-12.5 .== range(0, 100, 25)')
            {
            g_mY[i] = Yt[i]-12.5 ;
            }
    
        else if(Yt[i] + 25 .== range(0, 100, 50)')     //Rounding to 50 points +/- 25 points when 0, 100
            {
            g_mY[i] = Yt[i] + 25;
            }
        else if(Yt[i] - 25  .== range(0, 100, 50)')
            {
            g_mY[i] = Yt[i] - 25;
            }
        }

return 1;
}

main()
{
    simuldata(200);
    print(g_mY);
}

有用。但我想知道是否有更好、更优雅的方法来做到这一点。

再次感谢。

4

0 回答 0