将SAS GLM proc复制到R

时间:2018-05-17 09:43:18

标签: r sas glm

我想计算一个线性模型,以便在类别Y变量和一些Q数字变量上调整一些X变量的均值。

有人告诉我,我可以很容易地用SAS获取它们,我使用了这段代码:

proc glm data=TABLE_R;
    class Q(ref="Q1");
    model Y = Q X2 X3 X4 / solution;
    lsmeans Q/ stderr pdiff cov out=adjmeans;
run;

但是对R更加友好,我想复制这个程序,经过一些研究后,我结束了这段代码:

m = glm(Y ~ Q + X2 + X3 + X4, data=db) #using lm() didn't change anything
emmeans::emmeans(m, "Q") 

问题是,无论是否非常接近,模型系数都是不同的。以下是interceptQ的两个级别的示例:

#in R
  (Intercept)                  Q2                  Q3         
-0.1790444126        0.0051160461       -0.0013756817
#in SAS
  (Intercept)                  Q2                  Q3         
-0.1767853086        0.0016709301       -0.0031477746

实际上,在SAS中,我有一条消息说系数需要额外的计算(遗憾的是我不明白,R glm()是否缺少这个?):

  

注意:已经发现X'X矩阵是单数的,并且是广义的   逆用于求解正规方程。其估算的条款   接着是字母'B'并不是唯一可估计的。

我应该在这里添加哪个选项,以便我可以在SAS和R中找到相同的结果?

如果我不能,我该如何选择最合适的方法?

有用的帖子:Proc GLM (SAS) using RX'X matrix found to be singular

编辑:这很奇怪,但SAS和R中的有效性不同:

#SAS
Observations read: 81733
Observations used: 9000
#R
16357 Residual
(88017 observations deleted due to missingness)

1 个答案:

答案 0 :(得分:0)

如果你第一次做

,你会得到相同的系数
options(contrasts=c(“contr.SAS”,”contr.poly”))

在拟合模型之前。这将导致R使用SAS使用的相同参数化。

然而,即使没有这种变化,R的拟合值也将与SAS的拟合值相同,R的EMM将与SAS的lsmeans相匹配。那是因为我们并没有真正改变模型,我们只是改变它的参数化方式。