公式中的R和因子编码

Ste*_*fan 0 r formula r-factor

如果我想要自定义值假人,我该如何使用公式界面,例如,如果我想要值1和2,而不是0和1.估计可能如下所示,其中supp是因子变量.

fit <- lm(len ~ dose + supp, data = ToothGrowth)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,没有太多使用不同的值,但在许多情况下"重写"模型它可能是有用的.

编辑:实际上,我有3个级别,并希望两列的编码方式不同,因此一个是1/0变量,另一个是1/2变量.上面的例子只有两个级别.

Aar*_*ica 5

您可以通过创建要使用的矩阵并将其设置为contrasts参数lm或设置因子本身的默认对比度,将对比度设置为您想要的任何对比度.

一些样本数据:

set.seed(6)
d <- data.frame(g=gl(3,5,labels=letters[1:3]), x=round(rnorm(15,50,20)))
Run Code Online (Sandbox Code Playgroud)

你想到的对比:

mycontrasts <- matrix(c(0,0,1,0,1,1), byrow=TRUE, nrow=3)
colnames(mycontrasts) <- c("12","23")
mycontrasts
#     12 23
#[1,]  0  0
#[2,]  1  0
#[3,]  1  1
Run Code Online (Sandbox Code Playgroud)

然后你在lm通话中使用它:

> lm(x ~ g, data=d, contrasts=list(g=mycontrasts))

Call:
lm(formula = x ~ g, data = d, contrasts = list(g = mycontrasts))

Coefficients:
(Intercept)          g12          g23  
       58.8        -13.6          5.8  
Run Code Online (Sandbox Code Playgroud)

我们可以通过比较手段来检查它是否做对了:

> diff(tapply(d$x, d$g, mean))
    b     c 
-13.6   5.8 
Run Code Online (Sandbox Code Playgroud)

默认对比是使用第一级作为基线:

> lm(x ~ g, data=d)

Call:
lm(formula = x ~ g, data = d)

Coefficients:
(Intercept)           gb           gc  
       58.8        -13.6         -7.8  
Run Code Online (Sandbox Code Playgroud)

但是可以使用以下contrasts命令更改:

> contrasts(d$g) <- mycontrasts
> lm(x ~ g, data=d)

Call:
lm(formula = x ~ g, data = d)

Coefficients:
(Intercept)          g12          g23  
       58.8        -13.6          5.8  
Run Code Online (Sandbox Code Playgroud)