2012-03-08 103 views
0

如果我需要自定义值的假人,如何使用公式界面如果我需要值1和2,而不是0和1,估计可能如下所示,其中supp是因子变量。R和公式中的因子编码

fit <- lm(len ~ dose + supp, data = ToothGrowth) 

在这个例子中,没有太多使用不同的值,但在“重写”的模式很多情况下,它可能是有用的。

编辑:其实,我有3级,并希望两列编码不同,所以一个是1/0变量,另一个是1/2变量。上面的例子只有两个层次。

+1

取决于你为什么要做到这一点,设置'lm'的'contrasts'参数可能就足够了。 – 2012-03-08 12:02:24

+0

我认为非默认的对比方法可以提供我想要的编码。 – Stefan 2012-03-08 12:34:54

+2

你可以任意命名你的因子水平,例如'levels(supp)< - c(“1”,“2”)'。尽管给他们描述性的名字更好。 – 2012-03-08 13:55:27

回答

5

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

一些样本数据:

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

的对比,你心里有:

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 

然后你在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 

我们可以检查它通过比较手段来做正确的事情:

> diff(tapply(d$x, d$g, mean)) 
    b  c 
-13.6 5.8 

默认对比度是使用第一级为基准:

> lm(x ~ g, data=d) 

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

Coefficients: 
(Intercept)   gb   gc 
     58.8  -13.6   -7.8 

但可与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 
+0

太棒了,我不知道我是怎么错过的。不知道你可以只提供一个矩阵的定义;认为它必须是编码方案的名称。谢谢。 – Stefan 2012-03-08 20:31:39