我最近使用这里建议的方法模拟了我的数据。在考虑舍入规则时,我可以寻找可能的(真实)值。我有5条规则:
- 精确数字四舍五入为 1%;
- 四舍五入到 5% 的倍数;
- 四舍五入到 10% 的倍数;
- 四舍五入到 25% 的倍数;
- 四舍五入到 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);
}
有用。但我想知道是否有更好、更优雅的方法来做到这一点。
再次感谢。