如何匿名SAS和R中的数据

时间:2016-02-23 17:05:25

标签: r sas

我试图匿名化数据并用一些随机数替换client_rating(所以我不发布实际数据)但保留原始分布和值范围

Client_Id    Key    Rating
001          111       2
001          112       3
001          113      10 
002          111       1
002          112       4
002          112       9    

的值范围
Key=111 is from 1 thru 4
key=112 is from 1 thru 5
key=113 is from 1 thru 11

我正在寻找使用指定范围内的SAS和/或R对数据进行匿名化。我宁愿保留原始数据的均值和标准差,但不仅要改变原始值。我希望在指定的范围之间随机分配数字。

例如,按键111可以具有1到4之间的任何等级,但在现有数据中,分配的等级值仅为1和2.

感谢任何帮助。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

proc sgplot在SAS 9.4 M2中有jitter选项。

proc sgplot data=have;
   scatter x=key y=rating / jitter jitterwidth=0.85;
run;

jitterwidth定义为

  

抖动空间的宽度为中点的一部分   间距或最小间隔宽度。

Link

如果您需要手动抖动,可以通过简单地通过随机小分数增加或减少该值来执行数据步骤。我建议使用带有rand参数的uniform函数。例如,以下代码将从client_rating中随机添加或减去0到1之间的数字。这应该有效地使y方向的数据抖动。您也可以在x方向执行此操作以添加其他维度。

data want;
    set have;

    /* y jitter */
    if(rand('Uniform') > 0.5) then client_rating_jit = client_rating + rand('Uniform');
       else client_rating_jit = client_rating - rand('Uniform');

    /* optional: x jitter */
    if(rand('Uniform') > 0.5) then key_jit = key + rand('Uniform');
       else key_jit = key - rand('Uniform');

run;

如果您需要更多或更少的抖动,您可以用数学方式更改均匀分布的最小值/最大值:

min + (1+max - min)*rand('Uniform')