2015-01-09 4 views
1
d = data.frame(
    Temperature = c(rep("Cool", 6), rep("Warm", 6)), 
    Bact = c(rep("Bact 1", 2), rep("Bact 2", 2), rep("Bact 3", 2), rep("Bact 1", 2), rep("Bact 2", 2), rep("Bact 3", 2)), 
    Time = c(15.23,14.32,14.77,15.12,14.05,15.48,14.13,16.13,16.44,14.82,17.96,16.65) 
) 

Я создал небольшую рамку данных для двусторонней ANOVA. Я хочу, чтобы выполнить двусторонний ANOVA модель поСоздайте фиктивную переменную, чтобы сделать двустороннюю ANOVA

summary(aov(Time~Bact*Temperature, data=d)) 

время является зависимой переменной, а Bact и температуры две категориальные независимые переменные.

Вместо того, чтобы делать это методом ANOVA, я хочу узнать и доказать, что ANOVA также может быть выполнено с помощью модели линейной регрессии. Я хочу преобразовать свои данные в фиктивные переменные и выполнить линейную регрессию. Я ожидаю, что вернусь к тем же результатам. Фиктивные переменные также будут включать эффекты взаимодействия между Bact и Temperature.

Проблема в том, что я не знаю, как преобразовать свой фрейм данных в фиктивные переменные, чтобы он мог использоваться в функции lm().

ответ

1

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

d = data.frame(
    Temperature = c(rep("Cool", 6), rep("Warm", 6)), 
    Bact = c(rep("Bact 1", 2), rep("Bact 2", 2), rep("Bact 3", 2), rep("Bact 1", 2), rep("Bact 2", 2), rep("Bact 3", 2)), 
    Time = c(15.23,14.32,14.77,15.12,14.05,15.48,14.13,16.13,16.44,14.82,17.96,16.65) 
) 

, которая:

> d 
    Temperature Bact Time 
1   Cool Bact 1 15.23 
2   Cool Bact 1 14.32 
3   Cool Bact 2 14.77 
4   Cool Bact 2 15.12 
5   Cool Bact 3 14.05 
6   Cool Bact 3 15.48 
7   Warm Bact 1 14.13 
8   Warm Bact 1 16.13 
9   Warm Bact 2 16.44 
10  Warm Bact 2 14.82 
11  Warm Bact 3 17.96 
12  Warm Bact 3 16.65 

Так что вам нужно только dummify факторы (температура, Bact), так следующий процесс работы:

xfactors <- Filter(is.factor,d) #filter only the factors to dummify 
b <- data.frame(matrix(NA,nrow=nrow(xfactors),ncol=1)) #make empty data.frame to initiate b 
for (i in 1:ncol(xfactors)) { #start loop 
    a <- data.frame(model.matrix(~xfactors[,i])) #make dummies here 
    b <- cbind(b, a[-1]) #remove intercept and combine dummies 
} 
b <- data.frame(b[-1]) #make a data.frame 
#the reference dummy gets excluded automatically by model.matrix 
colnames(b) <- c('warm' , 'bact2' , 'bact3') #you will probably want to change the names to sth smaller 

> b 
    warm bact2 bact3 
1  0  0  0 
2  0  0  0 
3  0  1  0 
4  0  1  0 
5  0  0  1 
6  0  0  1 
7  1  0  0 
8  1  0  0 
9  1  1  0 
10 1  1  0 
11 1  0  1 
12 1  0  1 

Затем запустить модель:

new_data <- cbind(b, Time=d$Time) #add time to the data 
mymod <- lm(Time ~ warm*bact2+warm*bact3, data=new_data) #compute lm with interactions 
#you shouldn't compute the interactions between dummy variables because they come from the same variable 

Выход:

> summary(mymod) 

Call: 
lm(formula = Time ~ warm * bact2 + warm * bact3, data = new_data) 

Residuals: 
    Min  1Q Median  3Q Max 
-1.00 -0.67 0.00 0.67 1.00 

Coefficients: 
      Estimate Std. Error t value Pr(>|t|)  
(Intercept) 14.7750  0.6873 21.498 6.61e-07 *** 
warm   0.3550  0.9719 0.365 0.727  
bact2   0.1700  0.9719 0.175 0.867  
bact3  -0.0100  0.9719 -0.010 0.992  
warm:bact2 0.3300  1.3745 0.240 0.818  
warm:bact3 2.1850  1.3745 1.590 0.163  
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.9719 on 6 degrees of freedom 
Multiple R-squared: 0.6264, Adjusted R-squared: 0.3151 
F-statistic: 2.012 on 5 and 6 DF, p-value: 0.2097 
+1

'warm * bact2' ==' warm + bact2 + warm: bact2'. Добавление другого 'warm * bact3' действительно добавит' warm' дважды, но R достаточно умен, чтобы исключить несколько экземпляров переменных с тем же именем и включить их только один раз. Попробуйте 'lm (Time ~ warm + warm + warm, data = new_data)' и посмотрите, сколько коэффициентов вы получите :) – LyzandeR

0

lm() создаст для вас фиктивные переменные. Нет необходимости создавать их самостоятельно:

m <- lm(Time ~ Bact*Temperature, data = d) 
anova(m) 

Редактировать

Если вы хотите, чтобы заглянуть под капот lm(), вы можете увидеть дизайн матрицу с model.matrix(m)

+0

Это проблема самообучения. Мне интересно узнать статистику и сделать грязную работу, которую я иначе скрываю от функций R. – SmallChess

+0

@StudentT Если вы хотите сгенерировать матрицу «X», вы можете использовать 'model.matrix (Time ~ Bact * Temperature, data = d)', но тогда вы не можете использовать такую ​​матрицу как вход для 'lm' больше. Странно просить R просто сделать для вас половину работы. – MrFlick