2012-03-08 48 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