【问题标题】:Creating a Control Group in SAS在 SAS 中创建控制组
【发布时间】:2017-01-04 17:25:35
【问题描述】:

如何在 SAS 中创建数据集的子集,以便事先确定变量的均值、方差和观察次数?

例子:

OBS  NAME  x1 x2
1    Bill  3  2
2    James 4  5
3    Rick  5  6
4    Bob   3  7
5    Clas  5  2
6    Brye  2  9
7    Mann  8  5
8    Pids  4  8
9    Tony  0  7
10   Lou   2  6 

假设我想要一个包含 3 个观测值的子集,均值 (x1) = 4 和 std(x1) = 0.95。我将如何在 SAS 中创建这个子集?

我宁愿不使用 proc 方法做某事并反复猜测/检查。任何帮助表示赞赏!

更新:创建了一个逻辑模型来预测观察结果是属于治疗组还是对照组。然后取前 10% 的概率最高的在治疗组,但不包括在治疗组中,基本上用作对照组。

【问题讨论】:

  • 您通常会选择一个接近您的总体均值/标准(或者,您的较大样本均值/标准)的对照组吗?还是您要选择一个故意偏颇大的产品?
  • 另外,dv:对于一个 SAS 问题,这是一个非常详细且很好的问题。它不包含实际代码,但它包含对其他不起作用的方法的很好解释。我认为这是一个很好的问题。
  • Joe,我想根据一些变量的均值/标准差选择一个代表我的较大样本的对照组。本质上,如果我的较大样本的平均值为 4,标准值为 0.95,我想选择一个具有这些给定度量的样本。
  • 不确定是否有比proc surveyselect 更好的解决方案,如果离得太远,请重复。您可以使用control 排序使其更接近,但我不确定这是否合适。但也许其他人会知道一个。
  • 我添加了sas-iml 标签,因为我认为这可能有助于解决这个问题,特别是如果 Rick 有一个好的解决方案。如果您没有 SAS-IML,我们当然可以删除标签。

标签: sas sas-iml


【解决方案1】:

这是knapsack problem 的变体。您正在尝试查找对象的子集(此处为 3 个人),以使它们的属性接近某些指定的目标值(此处为总和 [或平均值] 和校正的平方和 [或标准偏差])。这也称为矩匹配问题。

如上所述,问题没有很好地定义。您需要指定一个目标函数来最小化。例如,您可以选择函数 (mean-target_mean)**2 + (stdDev - target_stdDev)**2 其中 (mean, stdDev) 是每个大小为 3 的样本的矩。

对于小型集合(如您的示例),您可以对“N 选择 3”组合进行完整枚举,以确定选择哪个组合。有关提示,请参阅文章 "Generate combinations in SAS"。例如,在 SAS/IML 中,您可以如下解决所述问题:

data A;
length NAME $5.;
input NAME $ x1 x2;
datalines;
Bill  3  2
James 4  5
Rick  5  6
Bob   3  7
Clas  5  2
Brye  2  9
Mann  8  5
Pids  4  8
Tony  0  7
Lou   2  6 
;

proc iml;
use A; read all var {Name x1}; close;

N = nrow(x1);              /* number of obs */          
k = 3;                     /* size of subset */
targetMean = 4;
targetStd = 0.95;

idx = allcomb(N, k);       /* all M='N choose 3' combinations */
X = shape( x1[idx], nrow(idx) );
mean = mean(X`);           /* 1 x M vector of sample means */
std  = std(X`);            /* 1 x M vector of sample std devs */
objective = (mean - targetMean)##2 + (std - targetStd)##2;
minVal = objective[><];    /* minimize objective */
minIdx = objective[>:<];   /* a sample that achieves minimum */

sampNames = Name[idx[minIdx,]];
sampVals = x1[idx[minIdx,]];
print sampVals[rowname=sampNames];

当然,解决方案可能不止一种。这个例子有 8 个解决方案。

对于有 N 个项目并且您想要一个大小为 k 的子集并且“N 选择 k”非常大的问题,您可以使用 RANCOMB 函数(或 PROC SURVEYSELECT,正如有人提到的那样)生成随机子集)。或者,您可以将此问题表述为优化问题。您可以使用 SAS/OR 或 SAS/IML 中的算法来解决它。对于中等大小的子集,您可以use genetic algorithms in SAS/IML,这对于类似背包的问题很有用。

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多