【问题标题】:Need help writing estimates statements in proc genmod需要帮助在 proc genmod 中编写估计语句
【发布时间】:2018-06-22 06:41:44
【问题描述】:

我正在使用 proc genmod 来预测在 4 个时间点测量的结果。结果是情绪清单的总分,范围从 0 到 82。许多参与者的分数为 0,因此 proc genmod 中的负二项式分布似乎很适合数据。

现在,我正在为如何编写/解释估算语句而苦苦挣扎。主要预测因子是基线时的 TBI 状态(0=否/1=是)和就诊(0=基线,1=第二次就诊,2=第三次就诊,4=第四次就诊),以及 TBI 状态和就诊的相互作用。

我如何写出我的估计,这样我才能退出: 1. 在基线时,患有 TBI 的人与没有患有 TBI 的人的情绪库存评分的平均差异。 和 2. 在 4 次研究访问中,患有 TBI 的人与没有患有 TBI 的人的情绪清单变化评分的平均差异?

以下是我到目前为止的内容,但我不确定如何解释输出,如果我的代码确实正确的话,也如下所示。:

proc genmod data = analyze_long_3 ;
  class id screen_tbi (param = ref ref = first) ;
  model nsi_total = visit_cent screen_tbi screen_tbi*visit_cent /dist=negbin ;
  output predicted = predstats; 
  repeated  subject=id  /type=cs; 
  estimate "tbi" intercept 1 visit_cent 0 0 0 0 screen_tbi 1 0 /exp;
  estimate "no tbi" intercept 1 visit_cent 0 0 0 0  screen_tbi 0 1 /exp; 
 estimate 'longitudinal   TBI'  intercept 1
                                visit_cent -1 1 1 1 
                                screen_tbi 1  0 
                                screen_tbi*visit_cent 1 0 0 0 
                                                      0 1 0 0
                                                      0 0 1 0 
                                                      0 0 0 1
                                                      0 0 0 0
                                                      0 0 0 0
                                                      0 0 0 0       
                                                      0 0 0 0 / exp; 
estimate 'longitudinal no  TBI '  intercept 1
                                visit_cent -1 1 1 1 
                                screen_tbi 0  1 
                                screen_tbi*visit_cent 0 0 0 0
                                                      0 0 0 0
                                                      0 0 0 0       
                                                      0 0 0 0
                                                      1 0 0 0 
                                                      0 1 0 0
                                                      0 0 1 0 
                                                      0 0 0 1  / exp;  

  where sample = 1 ; 
run;

【问题讨论】:

  • 你应该添加自学标签。

标签: sas


【解决方案1】:

第一个研究问题是获得 TBI 患者与非 TBI 患者的平均差异分数,基线。可以通过以下步骤实现:

1) 当 TBI = yes 且 Visit = baseline 时,获取估计的平均日志(分数);

2) 获取TBI = no,Visit =baseline 时的估计平均log(分数);

3) 1) – 2) 在 log(score) 值上有差异

4) Exp[3)] 以分数变化的百分比表示差异

为简化起见,设 T=TBI 水平,V = 就诊水平。需要澄清一点,在您的帖子中,有 4 个访问点,第一个作为参考;因此 V 应该有 3 个参数,而不是四个

以步骤 1) 为例,我们尝试编写 ESTIMATE 语句。这有点棘手。起初听起来像这样(T=0 和 V =0 作为参考):

ESTIMATE ‘Overall average’ intercept T 1 V 0 0 0;

但这是错误的。在上面的语句中,V的所有参数都设置为0。当所有参数都为0时,与从语句中取出V相同:

ESTIMATE ‘Overall average’ intercept T 1;

这不是 T=1 在基线水平的平均估计值。相反,无论访问点如何,它都会生成 T=1 的平均值,或者是所有访问级别的平均值。

问题是参考设置为V=0。在这种情况下,SAS 无法区分参考水平的估计值和所有水平的估计值之间的差异。事实上,它总是估计所有级别的平均值。要解决它,必须将引用设置为-1,即T=-1和V=-1作为引用,这样语句就像:

ESTIMATE ‘Average of T=1 V=baseline’ intercept T 1 V -1 -1 -1;

现在 SAS 明白了:很好!工作是在基线水平上获得平均值,而不是在所有水平上。

要使参考值为 -1 而不是 0,在 CLASS 语句中,应将选项指定为 PARAM = EFFECT,而不是 PARAM = REF。这带来了另一个问题:一旦 PARAM 没有设置为 REF,SAS 将忽略用户定义的引用。例如:

CLASS id T (ref=’…’) V (ref=’…’) / PARAM=EFFECT;

当 PARAM=EFFECT 时 (ref='...') 将被忽略。如何让 SAS 将 TBI=No 和 Visit=baseline 作为参考?好吧,SAS 会自动将最后一层作为参考。例如,如果变量 T 升序排列,则值 -1 为第一级,值 1 为最后一级;因此 1 将作为参考。相反,如果 T 以降序排列,则值 -1 位于末尾,并将用作 ref。这是通过 CLASS 语句中的选项“DESCENDING”实现的。

CLASS id T V / PARAM=EFFECT DESCENDING;

这样,参数排序为:

T 1 (TBI =1)

T -1(TBI 参考水平,即 TBI=no)

V 1 0 0(访问=4)

V 0 1 0(访问 = 3)

V 0 0 1(访问=2)

V -1 -1 -1(这是参考级别,访问=基线)

上述信息报告在 ODS 表“类级别信息”中。每次运行 PROC GENMOD 后检查该表总是好的。请注意,级别 (visit = 4) 位于级别 (visit =3) 之前,访问 =3 位于访问 =2 之前。

现在,让我们谈谈参数和模型方程。您可能知道,在 SAS 中,多级 V 确实被分解为虚拟 V。如果基线设置为参考级别,则假人将如下所示:

V4 = 第四次访问或基线

V3= 第三次访问,或基线

V2 = 第二次访问或基线

据此,方程可以写成:

LOG(s) = b0 + b1*T + b2*V4 + b3*V3 + b4*V2 

而:

s = 情绪清单的总分

T = 1 表示 TBI 状态为是,= -1 表示 TBI 状态为否

V4 = 1 表示第四次访问,= -1 表示基线

V3 = 1 表示第三次访问,=-1 表示基线

V2 = 1 表示第二次访问,= -1 表示基线

b0 到 b4 是参数的 beta 估计值

需要注意的是,模型中的顺序与语句CLASS中定义的顺序相同,与ODS表‘Class Level Information’中的顺序相同。 V4、V3、V2 必须出现在模型中,全或无,即如果要包括 VISIT 项,则应将 V4 V3 V2 全部引入模型方程。如果不包括 VISIT 项,则方程中不应包含 V4、V3 和 V2。

对于交互项,必须创建另外 3 个虚拟项:

T_V4 = T*V4

T_V3 = T*V3

T_V2 = T*V2

因此方程与交互项:

Log(s) = b0 + b1*T + b2*V4 + b3*V3 + b4*V2 + b5*T_V4 + b6* T_V3 + b7* T_V2 

“ESTIMATE”的 SAS 语句对应于模型方程。

例如,要估计所有参数和所有水平的总体平均值,公式为:

[Log(S)] = b0 ; 

而 [LOG(S)] 代表预期的 LOG(score)。因此,声明是:

ESTIMATE ‘overall (all levels of T and V)’ INTERCEPT;

在上述语句中,语句中的‘INTERCEPT’对应方程中的‘b0’

要估计 T =1 的平均 log(分数),并且对于所有级别的访问点,等式是

[LOG(S)] = b0 + b1 * T = b0 + b1 * 1

声明是

ESTIMATE ‘T=Yes, V= all levels’ INTERCEPT T 1;

在上述情况下,语句中的“T 1”对应于等式中的“*1”部分(即令T=1)

要估计 T = 1 和访问 = 基线的日志(分数)平均值,公式为:

[Log(s)] = b0 + b1*T + b2*V4 + b3*V3 + b4*V2 

    = b0 + b1*(1) + b2*(-1)+ b3*(-1) + b4*(-1)

声明是:

ESTIMATE ‘T=Yes, V=Baseline’ INTERCEPT T 1 V -1 -1 -1;

语句中的‘V -1 -1 -1’对应方程中的V4、V3和V2的值。我们上面已经提到,必须将虚拟模型 V4 V3 和 V2 都引入模型中。这就是为什么对于 V 项,总是有三个数字,例如 'V -1 -1 -1' 或 'V 1 1 1' 等。如果您将其设为 'V - ,SAS 将在日志中发出警告1 -1 -1 -1',因为有四个 '-1',比要求的多 1 个。在这种情况下,过多的“-1”将被忽略。相反,“V 1 1”很好。它与“V 1 1 0”相同。但是“V 1 1 0”是什么意思?要弄清楚这一点,您必须阅读 Allison 的书(参见参考资料)。

现在,让我们继续,添加交互项。方程:

[Log(s)] = b0 + b1*T + b2*V4 + b3*V3 + b4*V2 + b5*T_V4 + b6*T_V3 + b7*T_V2

由于T_V4 = T*V4 = 1 * (-1) = -1,同样T_V3 = -1,T_V2=-1,代入方程:

[Log(s)] = b0 + b1*1 + b2*(-1)+ b3*(-1)+ b4*(-1)+ b5*(-1) + b6*(-1) + b7*(-1)

声明是:

ESTIMATE ‘(1) T=Yes, V=Baseline, with interaction’ INTERCEPT T 1 V -1 -1 -1 T*V -1 -1 -1;

‘T*V -1 -1 -1’对应方程中的T_V4、T_V3和T_V2的值。

这就是步骤 1) 的声明!

第 2 步遵循相同的想法。在 TBI = no 和 Visit =baseline 时获得估计的平均日志(分数)。

T = -1,V4=-1,V3=-1,V2=-1。

T_V4 = T * V4 = (-1) * (-1) = 1

T_V3 = T * V3 = (-1) * (-1) = 1

T_V2 = T * V2 = (-1) * (-1) = 1

代入方程中的值:

[Log(s)] = b0 + b1*1 + b2*(-1)+ b3*(-1)+ b4*(-1)+ b5*(1) + b6*(1) + b7*(1)

注意数字:对于T:1;对于 V:-1 -1 -1;对于交互项:1 1 1

还有 SAS 声明:

ESTIMATE ‘(2) T=No, V=Baseline, with interaction’ INTERCEPT T 1 V -1 -1 -1 T*V 1 1 1;

估计结果可在 ODS 表“对比度估计结果”中找到。 对于步骤 3),减去估计值 (1) – (2),得到 log(score) 的差值;对于步骤(4),具有步骤 3)中差异的指数。

第二个研究问题:

在 4 次研究访问中,患有 TBI 的人与没有患有 TBI 的人的情绪库存变化评分的平均差异。 超过 4 次研究访问意味着所有访问级别。到现在为止,您可能已经知道该语句更简单了:

ESTIMATE ‘(1) T=Yes, V=all levels’ INTERCEPT T 1;
ESTIMATE ‘(2) T=Yes, V=all levels’ INTERCEPT T -1;

为什么没有交互项?因为考虑了所有访问级别。并且当考虑到所有级别时,您不必将任何与访问相关的术语放入语句中。

最后,上述方法需要一些手动计算。实际上,可以制作一行等效于上述方法的 ESTIMATE 语句。但是,我们上面讨论的方法更容易理解。如需更复杂的方法,请阅读 Allison 的书。

参考: 1. Allison, Paul D. 使用 SAS® 的逻辑回归:理论与应用,第二版。版权所有 © 2012,SAS Institute Inc.,美国北卡罗来纳州卡里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多