我想计算一个线性模型,以便在类别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")
问题是,无论是否非常接近,模型系数都是不同的。以下是intercept
和Q
的两个级别的示例:
#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 R,X'X matrix found to be singular
编辑:这很奇怪,但SAS和R中的有效性不同:#SAS
Observations read: 81733
Observations used: 9000
#R
16357 Residual
(88017 observations deleted due to missingness)
答案 0 :(得分:0)
如果你第一次做
,你会得到相同的系数options(contrasts=c(“contr.SAS”,”contr.poly”))
在拟合模型之前。这将导致R使用SAS使用的相同参数化。
然而,即使没有这种变化,R的拟合值也将与SAS的拟合值相同,R的EMM将与SAS的lsmeans相匹配。那是因为我们并没有真正改变模型,我们只是改变它的参数化方式。