R: Тестирование каждого уровня фактора без создания новых переменных
Предположим, у меня есть кадр данных с двоичной переменной группировки и фактором. Примером такой группирующей переменной может быть указана привязка к условиям лечения и контроля эксперимента. Ниже b - переменная группировки, а a - произвольная факторная переменная:
a <- c("a","a","a","b","b")
b <- c(0,0,1,0,1)
df <- data.frame(a,b)
Я хочу выполнить t-тесты с двумя образцами, чтобы оценить следующее:
- Для каждого уровня a существует ли разница в средней склонности к принятию этого уровня между группами, указанными в b.
Я использовал пакет dummies для создания отдельных макетов для каждого уровня фактора, а затем вручную выполнил t-тесты для полученных переменных:
library(dummies)
new <- dummy.data.frame(df, names = "a")
t.test(new$aa, new$b)
t.test(new$ab, new$b)
Я ищу помощь со следующим:
- Есть ли способ сделать это без создания большого количества фиктивных переменных с помощью dummy.data.frame()?
- Если нет более быстрого способа сделать это без создания большого количества манекенов, есть ли более быстрый способ выполнить t-тест по нескольким столбцам?
Заметка
Это похоже на R, но отличается от него: как выполнить одну и ту же операцию с несколькими переменными и почти то же, что и этот вопрос. Примените t-критерий ко многим столбцам в фрейме данных, разделенных по факторам, но решение этого вопроса больше не работает.
2 ответа
Вот база R
Решение, реализующее критерий хи-сквора на равенство пропорций, которое, как я полагаю, с большей вероятностью ответит на любой вопрос, который вы задаете о ваших данных (см. мой комментарий выше)
set.seed(1)
## generate similar but larger/more complex toy dataset
a <- sample(letters[1:4], 100, replace = T)
b <- sample(0:1, 10, replace = T)
head((df <- data.frame(a,b)))
a b
1 b 1
2 b 0
3 c 0
4 d 1
5 a 1
6 d 0
## create a set of contingency tables for proportions
## of each level of df$a to the others
cTbls <- lapply(unique(a), function(x) table(df$a==x, df$b))
## apply chi-squared test to each contingency table
results <- lapply(cTbls, prop.test, correct = FALSE)
## preserve names
names(results) <- unique(a)
## only one result displayed for sake of space:
results$b
2-sample test for equality of proportions without continuity
correction
data: X[[i]]
X-squared = 0.18382, df = 1, p-value = 0.6681
alternative hypothesis: two.sided
95 percent confidence interval:
-0.2557295 0.1638177
sample estimates:
prop 1 prop 2
0.4852941 0.5312500
Имейте в виду, однако, что вы, возможно, не захотите интерпретировать свои p-значения без корректировки на множественные сравнения. Быстрое моделирование показывает, что вероятность ошибочного отклонения нулевой гипотезы хотя бы в одном из ваших тестов может быть значительно выше 5%(!):
set.seed(11)
sum(
replicate(1e4, {
a <- sample(letters[1:4], 100, replace = T)
b <- sample(0:1, 100, replace = T)
df <- data.frame(a,b)
cTbls <- lapply(unique(a), function(x) table(df$a==x, df$b))
results <- lapply(cTbls, prop.test, correct = FALSE)
any(lapply(results, function(x) x$p.value < .05))
})
) / 1e4
[1] 0.1642
Я не совсем понимаю, что это делает со статистической точки зрения, но этот код генерирует список, где каждый элемент является выходом из t.test()
вы бежите выше:
a <- c("a","a","a","b","b")
b <- c(0,0,1,0,1)
df <- data.frame(a,b)
library(dplyr)
library(tidyr)
dfNew<-df %>% group_by(a) %>% summarise(count = n()) %>% spread(a, count)
lapply(1:ncol(dfNew), function (x)
t.test(c(rep(1, dfNew[1,x]), rep(0, length(b)-dfNew[1,x])), b))
Это сэкономит вам печатать t.test(foo, bar)
постоянно, а также устраняет необходимость в фиктивных переменных.
Изменить: я не думаю, что вышеупомянутый метод сохраняет порядок столбцов, только частота значений, измеряемых как 0 или 1. Если порядок важен (опять же, я не знаю цели этой процедуры), то вы можете использовать метод фиктивный а также lapply
сквозь data.frame
ты назвал new.
library(dummies)
new <- dummy.data.frame(df, names = "a")
lapply(1:(ncol(new)-1), function(x)
t.test(new[,x], new[,ncol(new)]))