如何将系数项应用于线性方程中的因子和交互项?


9

使用R,我为来自连续和离散预测变量混合的单个响应变量拟合了线性模型。这是非常基础的,但是我很难理解离散因子的系数是如何工作的。

概念:显然,连续变量'x'的系数是以以下形式应用的,y = coefx(varx) + intercept但是如果该因子是非数值的,那么该因子对因子z怎么起作用?y = coefx(varx) + coefz(factorz???) + intercept

具体:我在R中拟合了一个模型,lm(log(c) ~ log(d) + h + a + f + h:a)其中hf是离散的非数值因素。系数为:

Coefficients:
              Estimate 
(Intercept)  -0.679695 
log(d)        1.791294 
h1            0.870735  
h2           -0.447570  
h3            0.542033   
a             0.037362  
f1           -0.588362  
f2            0.816825 
f3            0.534440
h1:a         -0.085658
h2:a         -0.034970 
h3:a         -0.040637

我如何使用它们来创建预测方程:

log(c) =  1.791294(log(d)) + 0.037362(a) + h??? + f???? + h:a???? + -0.679695

还是我做错了?

我认为这概念是如果对象落在类别h1f2,公式变为:

log(c) =  1.791294(log(d)) + 0.037362(a) +  0.870735  + 0.816825  + h:a???? + -0.679695

但是我真的不清楚h:a交互式术语如何解析。谢谢你对我放松。

Answers:


14

这不是 R 特有的问题。R使用常规的系数显示。

在阅读此类回归输出时(在论文,教科书或统计软件中),您需要知道哪些变量是“连续的”而哪些变量是“分类的”:

  • “连续”值是明确的数字,其数值在回归拟合中按原样使用。

  • “类别”变量可以是任何类型,包括数字变量!使它们分类的原因是该软件将它们视为“因素”:也就是说,发现的每个不同的值都被认为是某种不同的指示

    大多数软件会将非数字值(例如字符串)视为因素。也可以说服大多数软件将数值视为因素。例如,邮政代码(在美国为邮政编码)看起来像一个数字,但实际上只是一组邮箱的代码。将邮政编码与其他数字相加,相减或相乘将毫无意义!(这种灵活性是常见错误的根源:如果您不小心或不知情,则软件可能会将认为是连续的变量视为变量,反之亦然。请小心!)

    但是,必须将分类变量以某种方式表示为数字,以便应用拟合算法。有许多编码方法。使用“虚拟变量”创建代码。通过在此站点上搜索,可以找到有关伪变量编码的更多信息;细节在这里无关紧要。

在这个问题中,我们被告知h并且f是绝对(“离散”)值。默认情况下,log(d)并且a是连续的。这就是我们需要知道的。该模型是

y=0.679695+1.791294 log(d)+0.870735 if h=h10.447570 if h=h2+0.542033 if h=h3+0.037362 a0.588362 if f=f1+0.816825 if f=f2+0.534440 if f=f30.085658 a if h=h10.034970 a if h=h20.040637 a if h=h3

这里应用的规则是:

  • 如果显示“拦截”项,则它是一个加法常数(第一行)。

  • 连续变量是由它们的系数相乘,即使是在“互动”,如h1:ah2:ah3:a条款。(这回答了原始问题。)

  • 在出现该因子的值的情况下,包括任何类别变量(或因子)。

例如,假设,,和。该模型的拟合值为log(d)=2h=h3a=1f=f2

y^=0.6797+1.7913×(2)+0.5420+0.0374×(1)+0.81680.0406×(1).

请注意,大多数模型系数是如何完全不出现在计算中的,因为它们h可以恰好采用三个值,,,因此只有三个系数适用于且这三个系数之一将在相互作用中相乘;类似地,在任何特定情况下,仅一个系数适用。h1h2h3(0.870735,0.447570,0.542033)h(0.085658,0.034970,0.040637)ah:af


8

这只是一条评论,但不适用于我们可以使用的有限编辑框。

我喜欢看到回归方程清晰地用纯文本编写,就像@whuber在他的回复中所做的那样。这是使用Hmisc软件包在R中实现此目的的快速方法。(我也将使用rms,但这并不重要。)基本上,它仅假定排版系统在您的计算机上可用。LATEX

让我们先模拟一些数据,

n <- 200
x1 <- runif(n)
x2 <- runif(n)
x3 <- runif(n)
g1 <- gl(2, 100, n, labels=letters[1:2])
g2 <- cut2(runif(n), g=4)
y <- x1 + x2 + rnorm(200)

然后拟合回归模型,

f <- ols(y ~ x1 + x2 + x3 + g1 + g2 + x1:g1)

结果如下:

Linear Regression Model

ols(formula = y ~ x1 + x2 + x3 + g1 + g2 + x1:g1)

                Model Likelihood     Discrimination    
                   Ratio Test           Indexes        
Obs      200    LR chi2     35.22    R2       0.161    
sigma 0.9887    d.f.            8    R2 adj   0.126    
d.f.     191    Pr(> chi2) 0.0000    g        0.487    

Residuals

    Min      1Q  Median      3Q     Max 
-3.1642 -0.7109  0.1015  0.7363  2.7342 

                   Coef    S.E.   t     Pr(>|t|)
Intercept           0.0540 0.2932  0.18 0.8541  
x1                  1.1414 0.3642  3.13 0.0020  
x2                  0.8546 0.2331  3.67 0.0003  
x3                 -0.0048 0.2472 -0.02 0.9844  
g1=b                0.2099 0.2895  0.73 0.4692  
g2=[0.23278,0.553)  0.0609 0.1988  0.31 0.7598  
g2=[0.55315,0.777) -0.2615 0.1987 -1.32 0.1896  
g2=[0.77742,0.985] -0.2107 0.1986 -1.06 0.2901  
x1 * g1=b          -0.2354 0.5020 -0.47 0.6396  

然后,要打印相应的回归方程,只需使用通用latex函数,如下所示:

latex(f)

将dvi转换为png后,您应该会得到类似的信息

在此处输入图片说明

IMO,这具有显示如何根据数字或分类预测器的实际值或选定值来计算预测值的优点。对于后者,因子水平在相应系数附近的方括号中指示。


1
+1这是一个不错的功能。术语的像语法,不过,是潜在的混淆:有此表达和分类变量之间没有明显的关系,也不是完全明显,确实代表一个指示器该而不是的数值!(在这里,真正含义是字母“ b”,这可能是足够的警告,但是当类别由数字编码,例如和,请注意...)+0.2099013{b}g1{b}g1=bbb01
笨拙

1
@whuber上面的图像已被裁剪,但是有一个脚注回想起“如果主题在c组中,{{c} = 1,否则为0”(c在这种特殊情况下,选择可能会造成混淆,因为我选择了两个字母代表g1级别,但通常非常直观-而且是纯tex,因此我们以后仍可以编辑源文件)。附件是我进行了更改的另一个摘要,g1因此现在是四个层次的因素。但是,使用0/1标签可能会更加令人困惑
chl 2012年

5

您可以通过以下方法检查“对比度”是否为默认值options()

$contrasts
        unordered           ordered 
"contr.treatment"      "contr.poly" 

如果将无序对比设置为contr.treatment(除非已更改,否则应保持不变),则每个因子的第一级将设置为基线。您只会在为因子的其他级别创建的虚拟变量之前获得系数的估计值。实际上,这些系数将是“在控制了模型中的所有其他因素之后,与该因素的基线水平相比,该因素在该水平上的响应变量平均有多大差异”。

我猜您的输出中有一个an h0f0h和f的基线水平(除非您有一个非默认的对比度选项,在这种情况下有几种可能;请?contr.treatment寻求帮助)。

与交互类似。如果我的上一段是正确的,则给出的估计值a实际上将是awhen 的斜率h=h0。摘要中给出的适用于相互作用的估算是不同水平的坡度变化量h

因此,在h = h1和f = f2的示例中,请尝试:

log(c) =  1.791294(log(d)) + (0.037362 - 0.085658) (a) +  0.870735  + 0.816825  -0.679695

哦,predict()如果您确实想预测某事(而不是为报告写出等式),那么您也可以用来做很多有用的事情。尝试?predict.lm查看对predict()由创建的对象有什么作用lm


+1(实际上,我在一个月前对此进行了投票,并且碰巧现在正在重新阅读它),在我看来,您建议您通过来检查对比度类型options()。您将不得不滚动大量的垃圾来找到所需的内容。您可以尝试options()$contrasts,它只会输出您想要的内容。
gung-恢复莫妮卡

好建议,我的大脑一定已经睡着了。
彼得·埃利斯

你知道吗,我经常在睡觉前回答简历的问题……
gung-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.