SAS为什么在ODS中使用下划线替换proc glm的观测值

问题描述

编辑!!!!进入底部以获得更好的可复制代码!

我有一个包含定量变量的数据集,该数据集缺少我需要估算的65个值。我使用ODS outputproc 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) ):

enter image description here

以下代码将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在估算列中添加了下划线:

enter image description here

换句话说,因为原始变量值不丢失(它是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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...