【发布时间】:2017-11-04 01:00:29
【问题描述】:
我正在尝试开发一个递归程序来使用平面概率来丢失字符串值(例如,如果一个变量具有三个可能的值并且缺少一个观察值,那么缺失的观察值将有 33% 的值被替换为任何值) .
注意:本文的目的不是讨论插补技术的优点。
DATA have;
INPUT id gender $ b $ c $ x;
CARDS;
1 M Y . 5
2 F N . 4
3 N Tall 4
4 M Short 2
5 F Y Tall 1
;
/* Counts number of categories i.e. 2 */
proc sql;
SELECT COUNT(Unique(gender)) into :rescats
FROM have
WHERE Gender ~= " " ;
Quit;
%let rescats = &rescats;
%put &rescats; /*internal check */
/* Collects response categories separated by commas i.e. F,M */
proc sql;
SELECT UNIQUE gender into :genders separated by ","
FROM have
WHERE Gender ~= " "
GROUP BY Gender;
QUIT;
%let genders = &genders;
%put &genders; /*internal check */
/* Counts entries to be evaluated. In this case observations 1 - 5 */
/* Note CustomerKey is an ID variable */
proc sql;
SELECT COUNT (UNIQUE(customerKey)) into :ID
FROM have
WHERE customerkey < 6;
QUIT;
%let ID = &ID;
%put &ID; /*internal check */
data want;
SET have;
DO i = 1 to &ID; /* Control works from 1 to 5 */
seed = 12345;
/* Sets u to rand value between 0.00 and 1.00 */
u = RanUni(seed);
/* Sets rand gender to either 1 and 2 */
RandGender = (ROUND(u*(&rescats - 1)) + 1)*1;
/* PROBLEM Should if gender is missing set string value of M or F */
IF gender = ' ' THEN gender = SCAN(&genders, RandGender, ',');
END;
RUN;
I SCAN 函数不会在性别范围内创建 F 或 M 观察值。它似乎还创建了一个新的 M 和 F 变量。此外,DO 循环在 CustomerKey 下创建附加条目。有没有办法摆脱这些?
我更喜欢使用循环和宏来解决这个问题。我还不精通数组。
【问题讨论】:
-
这段代码有很多不同的问题。您遇到的主要问题是哪一个?您尝试解决什么问题?
-
“它似乎还创建了一个新的 M 和 F 变量。”你应该先解决这个问题。你能想到为什么它会创建一个名为 M 的变量吗?
-
我知道您说插补方法超出了范围,但您为什么不使用其中一种 MI 方法。对于分类,我喜欢使用决策树来预测最佳值。您还应该查看 RNDTBL() 或 Bernoulli 随机变量以直接获取 1 和 0。正如其他人所提到的,到目前为止,您的代码有很多错误。
-
标题有点偏离,因为这个算法没有递归。
-
也发布您的示例数据的预期输出。
标签: sas missing-data