如何在SAS中执行过采样?

如何在SAS中执行过采样?,sas,sampling,Sas,Sampling,我有一个包含1100个样本的数据集,目标类是isReturn,有 800 isReturn='True' 300 isReturn='False' 如何使用PROC SURVEYSELECT对300 isReturn='False'进行过采样,从而使800 isReturn='False'达到数据集平衡 提前感谢。我可能不明白您想要什么,但如果您只想让800名false人员参与,您可以使用proc surveyselect或数据步骤 数据步骤将为您提供粒度控制。这会给你两次300,再加上第三次从

我有一个包含1100个样本的数据集,目标类是isReturn,有

800 isReturn='True'

300 isReturn='False'

如何使用
PROC SURVEYSELECT
300 isReturn='False'
进行过采样,从而使
800 isReturn='False'
达到数据集平衡


提前感谢。

我可能不明白您想要什么,但如果您只想让800名
false
人员参与,您可以使用
proc surveyselect
或数据步骤

数据步骤将为您提供粒度控制。这会给你两次300,再加上第三次从300中随机抽取的200(可能是1或0次)

data have;
length isReturn $5;
do _n_=1 to 800;
  isReturn='True';
  output;
  if _n_ le 300 then do;
    isReturn='False';
    output;
  end;
end;
run;

data want;
set have;
retain k 200 n 300;
if isReturn='True' then output;
else do;
  output;
  output;
  if ranuni(7) le k/n then do;
    output;
    k+-1;
  end;
  n+-1;
end;
run;
你可以很容易地调整它,以得到你想要的任何分布(你可以从'600'中取500(双倍300),例如,将k和n设置为500和600,并执行两次if位,每次递减n一次)

您也可以使用
proc surveyselect
执行此操作

proc surveyselect data=have(where=(isReturn='False')) out=want_add method=urs n=500 outhits;
run;
这将给你额外的500条记录,随机选择替换;只需将它们添加回原始数据集。您没有粒度控制,但很容易编写代码

或者,您可以一步完成这项工作。然而,这并不能保证你的记录无论是真是假都会被呈现出来——所以这可能并不能完全满足你的要求;提交完整性

data sizes;
input isReturn :$5. _NSIZE_;
datalines;
False 800
True 800
;;;;
run;
proc sort data=have;
by isReturn;
run;
proc surveyselect data=have out=want method=urs n=sizes outhits;
strata isReturn;
run;

所有这些都假设您试图获得原始数据集的100%以及一些。如果您试图以与真实记录相同的概率选择虚假记录,但最终选择的样本比总数小(并且只选择一次,即不替换),那么您应该查看
地层
语句。

您有800/200,希望结果为800/800?基本上,每行isReturn=FALSE在这里四次?或者你是在尝试设置一些东西,以便可以引导/等等,并且希望能够这样做,并对“false”行进行加权,以便每个true/false具有相同的概率?@Joe,这只是一个示例,而不是精确地选择4次200行。对于下采样,我可以在
PROC SURVEYSELECT
中指定大小(比我的样本小,比如说150),但我只是想知道是否有一种方法可以进行上采样,而不给不同的类增加任何成本(权重)。我只是想弄明白为什么不使用数据步骤。@Joe,因为我认为如此昂贵的软件将提供大多数免费开源软件包提供的过采样方法。您是否介意建议使用数据步骤实现此目的的最佳方法?谢谢。我可能误解了你的术语。我使用各种形式的“抽样”来建议抽取一个较小的样本,即抽取10000人,抽取800人。使用surveyselect在SAS中很容易做到这一点。我把你的问题理解为采取普查样本,实际上是增加更多记录,以增加较小样本的数量。也许你需要更详细地解释,因为你的问题不是很彻底。