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)

Я ищу помощь со следующим:

  1. Есть ли способ сделать это без создания большого количества фиктивных переменных с помощью dummy.data.frame()?
  2. Если нет более быстрого способа сделать это без создания большого количества манекенов, есть ли более быстрый способ выполнить 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)]))
Другие вопросы по тегам