如何在SAS中扭曲(添加randomnes)数据集

时间:2015-11-12 09:37:30

标签: random sas

首先,我是第一次发布海报,所以请耐心等待。我在这里和其他地方寻找过答案,但还没有找到我正在寻找的东西。我对SAS(和编程)很陌生,所以很有可能我找错了。

总之。我从事研究工作,目前担任关于工作和健康的大型纵向调查问卷的数据管理员,这项研究是为同一参与者收集的,用于五波数据收集。我们希望促进数据的传播和数据集的使用,因此我们希望根据当前数据创建教学数据集。教学数据集目前包括2000个随机选择的个体和463个变量 - 这只是量表的一个子集和主集的一些背景信息。

我的问题是,在我们开始传播集合之前必须满足的标准之一是,每个人都必须保持匿名 - 因此我们必须在数据集中包含随机错误。我已经将许多背景变量,收入,年龄,教育等分组。但我希望每个变量至少包含一些随机错误。我无法弄明白必须这样做。大多数变量看起来像这样:

while($rowcount = mysql_fetch_array($result)) {
    $et = $rowcount['EndTime']; $st = $rowcount['StartTime'];
    $sum = $et < $st ? 
          $et + (24 - $st)
          :
          $et - $st;
    $count += $sum;
}

大多数变量的值可以在1到5之间(并且缺失)。我一直在考虑更换值(即,每1 = 2,每2 = 3等),但它会使最终结果变坏,因为许多分析将变得奇怪。对于每个变量,我想将2000个观测值中的50个随机改变为变量可以采用的任何整数(1到5或缺失)。

有什么建议吗?我想我可以将变量y的每个第n次观察变为x - 但这不是随机的。我想改变所有变量,而不是为每个变量编写代码。

2 个答案:

答案 0 :(得分:1)

我会使用数据步骤并随机选择观察值进行更改。

data want;
set have;
/*Random uniform - change seed as you see fit*/
_rand= ranuni(1); 

/*Select approximately 50/2000 = 2.5% records*/
if _rand > 50/2000 then do;
   /*Set variable to integer 0-5*/
   var1 = floor(6*ranuni(1));
   /*if set to 0, then set missing*/
   if var1 = 0 then 
      var1=.;

   /*Do this however many times you need*/
end;
/*do not put the _rand value into the output data*/
drop _rand;
run;

答案 1 :(得分:0)

我不熟悉SAS,但我会建议一些应该通用的原则

  1. 读取字段的数据
  2. 对随机变量进行采样(通常是随机数函数返回0到1之间的数字)
  3. 如果样本低于预先计算的数字,请转移数字,否则继续下一个数字。
  4. 移动时,再次对随机数进行采样,然后乘以6,然后向下舍入...如果6该字段应为空...

    预先计算的数字在这种情况下是2000/50 ..