问题描述
编辑!!!!进入底部以获得更好的可复制代码!
我有一个包含定量变量的数据集,该数据集缺少我需要估算的65个值。我使用ODS output
和proc glm
同时为此变量拟合模型并预测值:
ODS output
predictedvalues=pred_val;
proc glm data=Six_min_miss;
class nyha_4_enroll;
model SIX_MIN_WALK_z= nyha_4_enroll kccq12sf_both_base /p solution;
run;
ODS output close;
但是,我缺少21个预测值,因为我的观察值中有21个缺少两个独立的预测器之一。
如果SAS由于此缺失而无法做出预测,则会留下一个下划线(不是句号)来表明它没有做出预测。
由于某种原因,如果无法做出预测,SAS也会在“观察到的”值下划线-即使存在观察到的值(“观察到”下突出显示的单元格中的值应为181.0512) ):
以下代码将ODS输出数据集与观测值和预测值以及原始数据合并。第二个数据步骤尝试创建变量的新“估算”版本,如果不丢失,它将使用原始观测值,如果不丢失,则使用预测值:
data PT_INFO_6MIN_IMP_temp;
merge PT_INFO pred_val;
drop dependent observation biased residual;
run;
data PT_INFO_6MIN_IMP_temp2;
set PT_INFO_6MIN_IMP_temp;
if missing (SIX_MIN_WALK_z) then observed=predicted;
rename observed=SIX_MIN_WALK_z_IMPUTED;
run;
但是,正如您所看到的,当存在应该使用的原始值时,SAS在估算列中添加了下划线:
换句话说,因为原始变量值不丢失(它是181.0512),所以SAS应该已经采用了该值并将其复制到估算值列中。而是在其下划线。
我也尝试过if SIX_MIN_WALK_z =. then observed=predicted
请让我知道我在做什么错和/或如何解决。我希望这一切都说得通。
谢谢
编辑!!!!编辑!!!!!编辑!!!!!
请参见下面的截断数据集,以便可以重现图片中的内容。我只使用了数据集的前30行。对于我要归因的因变量,缺少三个观察值(obs 8,11,26)。每个自变量都不存在,因此无法进行预测(obs 8和24)。您会注意到,因变量的“ _IMP”版本反映了原始变量。当涉及到丢失的Obs#8时,它不会估算值,因为它无法预测值。当到达#11和#26时,它能够预测值,因此将预测值添加到“ _IMP”。但是,对于Obs#24,它无法预测值,但是我不需要它,因为我们已经在原始变量(181.0512)中有了观测值。我希望SAS将此值放在“ _IMP”列中,但是要在其下划线。
data test;
input Study_ID nyha_4_enroll kccq12sf_both_base SIX_MIN_WALK_z;
cards;
01-001 3 87.5 399.288
01-002 4 83.333333333 411.48
01-003 2 87.5 365.76
01-005 4 14.583333333 0
01-006 3 52.083333333 362.1024
01-008 3 52.083333333 160.3248
01-009 2 56.25 426.72
01-010 4 75 .
01-011 3 79.166666667 156.3624
01-012 3 27.083333333 0
01-013 4 45.833333333 0
01-014 4 54.166666667 .
01-015 2 68.75 317.2968
01-017 3 29.166666667 196.2912
01-019 4 100 141.732
01-020 4 33.333333333 0
01-021 2 83.333333333 222.504
01-022 4 20.833333333 389.8392
01-025 4 0 0
01-029 4 43.75 0
01-030 3 83.333333333 236.22
01-031 2 35.416666667 302.0568
01-032 4 64.583333333 0
01-033 4 33.333333333 0
01-034 . 100 181.0512
01-035 4 12.5 0
01-036 4 66.666666667 .
01-041 4 75 0
01-042 4 43.75 0
01-043 4 72.916666667 0
;
run;
data test2;
set test;
drop Study_ID;
run;
ODS output
predictedvalues=pred_val;
proc glm data=test2;
class nyha_4_enroll;
model SIX_MIN_WALK_z= nyha_4_enroll kccq12sf_both_base /p solution;
run;
ODS output close;
data combine;
merge test2 pred_val;
drop dependent observation biased residual;
run;
data combine_imp;
set combine;
if missing (SIX_MIN_WALK_z) then observed=predicted;
rename observed=SIX_MIN_WALK_z_IMPUTED;
run;
解决方法
特殊缺失值(._
)标记了由于自变量缺失而从模型中排除的观测值。
尝试一个简单的例子:
data class;
set sashelp.class(obs=10) ;
keep name sex age height;
if _n_=3 then age=.;
if _n_=4 then height=.;
run;
ods output predictedvalues=pred_val;
proc glm data=class;
class sex;
model height = sex age /p solution;
run; quit;
proc print data=pred_val; run;
由于观察#3,在预测结果数据集中缺少自变量AGE的值,因此将观察值,预测值和残差值设置为._
。
Obs Dependent Observation Biased Observed Predicted Residual
1 Height 1 0 69.00000000 64.77538462 4.22461538
2 Height 2 0 56.50000000 58.76153846 -2.26153846
3 Height 3 1 _ _ _
4 Height 4 1 . 61.27692308 .
5 Height 5 0 63.50000000 64.77538462 -1.27538462
6 Height 6 0 57.30000000 59.74461538 -2.44461538
7 Height 7 0 59.80000000 56.24615385 3.55384615
8 Height 8 0 62.50000000 63.79230769 -1.29230769
9 Height 9 0 62.50000000 62.26000000 0.24000000
10 Height 10 0 59.00000000 59.74461538 -0.74461538
如果您真的想只用很容易做到的原始变量的值替换输出中的OBSERVED或PREDICTED的值。只需重新组合源数据集即可。您可以使用PROC GLM的ID语句将其包含要输出的任何变量。喜欢
id name sex age height;
现在,您可以使用数据集步骤进行任何调整。例如,要创建一个新的高度变量,该变量可以是原始值或预测值,您可以使用:
data want ;
set pred_val ;
NEW_HEIGHT = coalesce(height,predicted);
run;
proc print data=want width=min;
var name height age predicted new_height ;
run;
结果:
NEW_
Obs Name Height Age Predicted HEIGHT
1 Alfred 69.0 14 64.77538462 69.0000
2 Alice 56.5 13 58.76153846 56.5000
3 Barbara 65.3 . _ 65.3000
4 Carol . 14 61.27692308 61.2769
5 Henry 63.5 14 64.77538462 63.5000
6 James 57.3 12 59.74461538 57.3000
7 Jane 59.8 12 56.24615385 59.8000
8 Janet 62.5 15 63.79230769 62.5000
9 Jeffrey 62.5 13 62.26000000 62.5000
10 John 59.0 12 59.74461538 59.0000