如何在R中使用效果编码而不是伪编码进行回归?


15

我目前正在开发一个回归模型,其中我仅将分类/因子变量作为自变量。我的因变量是对数转换比率。

只需在R中运行正常回归就相当容易,因为R一旦它们成为“ factor”类型,R就会自动知道如何编写假人。但是,这种类型的编码还意味着将每个变量的一个类别用作基线,这使其难以解释。

我的教授告诉我,请改用效果编码(-1或1),因为这意味着对截距使用了均值。

有人知道如何处理吗?

到目前为止,我尝试过:

gm <- mean(tapply(ds$ln.crea, ds$month,  mean))
model <- lm(ln.crea ~ month + month*month + year + year*year, data = ds, contrasts = list(gm = contr.sum))

Call:
lm(formula = ln.crea ~ month + month * month + year + year * 
    year, data = ds, contrasts = list(gm = contr.sum))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.89483 -0.19239 -0.03651  0.14955  0.89671 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.244493   0.204502 -15.865   <2e-16 ***
monthFeb    -0.124035   0.144604  -0.858   0.3928    
monthMar    -0.365223   0.144604  -2.526   0.0129 *  
monthApr    -0.240314   0.144604  -1.662   0.0993 .  
monthMay    -0.109138   0.144604  -0.755   0.4520    
monthJun    -0.350185   0.144604  -2.422   0.0170 *  
monthJul     0.050518   0.144604   0.349   0.7275    
monthAug    -0.206436   0.144604  -1.428   0.1562    
monthSep    -0.134197   0.142327  -0.943   0.3478    
monthOct    -0.178182   0.142327  -1.252   0.2132    
monthNov    -0.119126   0.142327  -0.837   0.4044    
monthDec    -0.147681   0.142327  -1.038   0.3017    
year1999     0.482988   0.200196   2.413   0.0174 *  
year2000    -0.018540   0.200196  -0.093   0.9264    
year2001    -0.166511   0.200196  -0.832   0.4073    
year2002    -0.056698   0.200196  -0.283   0.7775    
year2003    -0.173219   0.200196  -0.865   0.3887    
year2004     0.013831   0.200196   0.069   0.9450    
year2005     0.007362   0.200196   0.037   0.9707    
year2006    -0.281472   0.200196  -1.406   0.1625    
year2007    -0.266659   0.200196  -1.332   0.1855    
year2008    -0.248883   0.200196  -1.243   0.2164    
year2009    -0.153083   0.200196  -0.765   0.4461    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Residual standard error: 0.3391 on 113 degrees of freedom
Multiple R-squared: 0.3626, Adjusted R-squared: 0.2385 
F-statistic: 2.922 on 22 and 113 DF,  p-value: 0.0001131 

1
看一下?contrasts,我认为它的contr.sum可以用来比较平均值-检查R帮助文件
user20650 2013年

Answers:


13

原则上,存在两种类型的对比编码,截距将使用这些对比编码来估计均值。这些是求和对比重复对比(滑动差异)。

这是一个示例数据集:

set.seed(42)
x <- data.frame(a = c(rnorm(100,2), rnorm(100,1),rnorm(100,0)),
                b = rep(c("A", "B", "C"), each = 100))

条件的意思是:

tapply(x$a, x$b, mean)
         A           B           C 
2.03251482  0.91251629 -0.01036817 

大中位数:

mean(tapply(x$a, x$b, mean))
[1] 0.978221

您可以在中使用contrasts参数指定对比编码的类型lm

总和对比

lm(a ~ b, x, contrasts = list(b = contr.sum))

Coefficients:
(Intercept)           b1           b2  
     0.9782       1.0543      -0.0657 

截距是中庸之道。第一斜率是第一因子水平与均值之间的差。第二斜率是第二因子水平和均值之间的差。

反复对比

创建重复对比的功能是该MASS包的一部分。

lm(a ~ b, x, contrasts = list(b = MASS::contr.sdif))

Coefficients:
(Intercept)         b2-1         b3-2  
     0.9782      -1.1200      -0.9229 

截距是中庸之道。斜率表明连续因子水平之间的差异(2对1、3对2)。


嗯,只是尝试了您的建议,但我不确定任何代码都符合我的要求。问题是,我在一个IV中有{1998,...,2007}年,在另一个IV中有数月{Jan,...,Dec}。因为现在是lm函数,所以自动使April成为1998年的拦截器。相反,我只是希望拦截器是一个整体意思……我真的不知道在考虑时是否有意义……
Kasper Christensen

@KasperChristensen如果您像示例中那样指定对比度,则截距将为“均值”。请提供您尝试过的可复制示例。
Sven Hohenstein

@SvenHohenstein为什么在总和对比中C分类值没有b3系数?它应该是-0.9885891。
维瓦尔第

@Vivaldi b3的值由截距和b1,b2确定。没有自由度可作另一种对比。
Sven Hohenstein '18

@SvenHohenstein这不是一个共线性问题,因为b3可以直接表示为其他变量的线性组合:(3 *均值-b1-b2)?
维瓦尔第

6

细说:如果您的教授告诉您使用变量编码,那么(-1, 1)他会告诉您使用效果编码,而不是效果大小。无论如何,@ user20650是正确的。和往常一样,UCLA统计帮助网站上有一个有用的页面,说明如何使用R进行此操作。

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.