2012-03-08 2 views
0

Как использовать интерфейс формулы, если я хочу, чтобы пользовательские значки были, например. если мне нужны значения 1 и два, а не 0 и 1. Оценка может выглядеть следующим образом, где supp является фактор-переменной.R и кодирование коэффициента в формуле

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

В этом примере, существует не так много использования различных значений, но во многих случаях модели «переписано» это может быть полезно.

EDIT: На самом деле, у меня есть, например, 3 уровня и хотите, чтобы два столбца были закодированы по-разному, поэтому одна является переменной 1/0, а другая - переменной 1/2. Вышеприведенный пример имеет только два уровня.

+1

В зависимости от того, почему вы хотите это сделать, установка аргумента 'контрастов'' lm' может быть достаточной. –

+0

Я думаю, что не стандартные методы контрастности дают кодирование, которое я хочу. – Stefan

+2

Вы можете называть уровни факторов, которые хотите, например, 'levels (supp) <- c (" 1 "," 2 ")'. Гораздо лучше дать им описательные имена. –

ответ

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

Смежные вопросы