Зацикливание через t.tests для подмножеств фрейма данных в r

У меня есть фрейм данных ‘math.numeric’ с 32 переменными. Каждая строка представляет ученика, и каждая переменная является атрибутом. Студенты были помещены в 5 групп в зависимости от их окончательного classа.

Данные выглядят следующим образом:

head(math.numeric) school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason ... group 1 1 18 2 1 1 4 4 1 5 1 2 1 1 17 2 1 2 1 1 1 3 1 2 1 1 15 2 2 2 1 1 1 3 3 3 1 1 15 2 1 2 4 2 2 4 2 4 1 1 16 2 1 2 3 3 3 3 2 3 1 2 16 2 2 2 4 3 4 3 4 4 

Я выполняю t-тесты для каждой переменной для группы 1 по сравнению со всеми другими группами, чтобы идентифицировать значительно разные атрибуты с этой группой. Я ищу, чтобы вытащить значения p для каждого теста, такие как:

 t.test(subset(math.numeric$school, math.numeric$group == 1), subset(math.numeric$school, math.numeric$group != 1))$p.value t.test(subset(math.numeric$sex, math.numeric$group == 1), subset(math.numeric$sex, math.numeric$group != 1))$p.value t.test(subset(math.numeric$age, math.numeric$group == 1), subset(math.numeric$age, math.numeric$group != 1))$p.value 

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

Я довольно новичок в этом, поэтому любая помощь будет оценена по достоинству.

Courtney

Данные вашего примера недостаточно для фактического выполнения t-тестов во всех подгруппах. По этой причине я беру набор iris , который содержит 3 вида растений: Setosa, Versicolor и Virginica. Это мои группы. Вы должны будете соответствующим образом скорректировать свой код. Ниже я покажу, как тестировать одну группу по сравнению со всеми другими группами, одну группу по отношению друг к другу и все комбинации отдельных групп.

Одна группа по сравнению со всеми другими группами:

Во-первых, допустим, я хочу сравнить Versicolor и Virginica с Setosa, то есть Setosa – это моя group 1 к которой нужно сравнить все остальные группы. Легкий способ добиться того, что вы хотите, это следующее:

 sapply(names(iris)[-ncol(iris)], function(x){ t.test(iris[iris$Species=="setosa", x], iris[iris$Species!="setosa", x])$p.value }) Sepal.Length Sepal.Width Petal.Length Petal.Width 7.709331e-32 1.035396e-13 1.746188e-69 1.347804e-60 

Здесь я предоставил имена различных переменных в names(iris) наборов данных names(iris) – exlcuding столбец, указывающий переменную группировки [-ncol(iris)] (так как это последний столбец) – как вектор для sapply , который передает соответствующие имена в качестве аргументов функции, которую я определил.

Одна группа по отношению к каждой из других групп:

Если вы хотите сделать групповые сравнения для всех групп, может оказаться полезным следующее: во-первых, создайте фрейм всех комбинаций переменных x группы, которые вы собираетесь делать, конечно, за исключением самой группы группировки и группы ссылок. Этого можно достичь:

 comps <- expand.grid(unique(iris$Species)[-1], # excluding Setosa as reference group names(iris)[-ncol(iris)] # excluding group column ) head(comps) Var1 Var2 1 versicolor Sepal.Length 2 virginica Sepal.Length 3 versicolor Sepal.Width 4 virginica Sepal.Width 5 versicolor Petal.Length 6 virginica Petal.Length 

Здесь Var1 - разные виды, а Var2 - разные переменные, для которых должны быть сделаны сравнения. В этом случае подразумевается ссылочная group 1 или Setosa. Теперь я могу использовать apply для создания тестов. Я делаю это, используя каждую строку comps качестве аргумента с двумя элементами, первая из которых указывает, на какой строке она находится, а второй аргумент указывает, какую переменную следует сравнивать. Они будут использоваться для подмножества исходного фрейма.

 comps$pval <- apply(comps, 1, function(x) { t.test(iris[iris$Species=="setosa", x[2]], iris[iris$Species==x[1], x[2]])$p.value } ) 

где группа 1, например, Setosa, жестко закодирована в функции. Это дает мне фреймворк с p-значениями для всех комбинаций (с Setosa в качестве контрольной группы), чтобы их было легко найти:

 head(comps) Var1 Var2 pval 1 versicolor Sepal.Length 3.746743e-17 2 virginica Sepal.Length 3.966867e-25 3 versicolor Sepal.Width 2.484228e-15 4 virginica Sepal.Width 4.570771e-09 5 versicolor Petal.Length 9.934433e-46 6 virginica Petal.Length 9.269628e-50 

Все комбинации групп:

Вы можете легко расширить это описание, чтобы создать фрейм данных, содержащий p-значения t-тестов для каждой комбинации групп. Один из подходов:

 comps <- expand.grid(unique(iris$Species), unique(iris$Species), names(iris)[-ncol(iris)]) 

Теперь это три столбца. Первые два представляют собой группы, а третья - переменная:

 head(comps) Var1 Var2 Var3 1 setosa setosa Sepal.Length 2 versicolor setosa Sepal.Length 3 virginica setosa Sepal.Length 4 setosa versicolor Sepal.Length 5 versicolor versicolor Sepal.Length 6 virginica versicolor Sepal.Length 

Вы можете использовать это для проведения тестов:

 comps$pval <- apply(comps, 1, function(x) { t.test(iris[iris$Species==x[1], x[3]], iris[iris$Species==x[2], x[3]])$p.value } ) 

Я получаю сообщение об ошибке: что мне делать?

t.test может выдать сообщение об ошибке, если размер выборки слишком мал или значения постоянные для одной группы. Это проблематично, поскольку это может произойти только для определенных групп, и вы не можете заранее знать, какой именно. Тем не менее ошибка приведет к нарушению всего вызова функции, чтобы apply , и вы не сможете увидеть никаких результатов.

Способ обойти это и идентифицировать проблемные группы - это обернуть функцию t.test вокруг dplyr::failwith (см. Также ?tryCatch ). Чтобы показать, как это работает, рассмотрите следующее:

 smalln <- data.frame(a=1, b=2) t.test(smalln$a, smalln$b) > Error in t.test.default(smalln$a, smalln$b) : not enough 'x' observations failproof.t <- failwith(default="Some default of your liking", t.test, quiet = T) failproof.t(smalln$a, smalln$b) [1] "Some default of your liking" 

Таким образом, всякий раз, когда t.test выкидывает ошибку, вы получаете вместо этого символ и вычисление продолжается с другими группами. Излишне говорить, что вы также можете установить по default номер или что-то еще. Это не должно быть персонажем.

Статистический отказ от ответственности: сказав все это, обратите внимание, что проведение нескольких t-тестов не обязательно является хорошей статистической практикой. Вы можете настроить свои p-значения для учета нескольких тестов, или вы можете использовать альтернативные процедуры тестирования, которые проводят совместные тесты.

Как это?

 pvals <- numeric() #the vector of p values k <- 1 #in case you choose to use a subset not continuing from 1 # "for(i in seq(1,5))" is just doing the pvalues for the first 5 columns. You could do a # list, like "c(1,2,4)" (in place of "seq(1,5)"), to do tests for columns 1, 2, and 4. # To do all of the columns, try "for(i in seq(1,(ncol(math.numeric)-1)))". for(i in seq(1,5)){ # using your code to grab the p-values and store them in the kth element of "pvals" pvals[k] <- t.test(subset(math.numeric[,i], math.numeric$group == 1), subset(math.numeric[,i], math.numeric$group != 1))$p.value #iterating the "pvals" vector entry counter k=k+1 } pvals #printing the p values for each test 

Рассмотрим разбиение кадра данных по группам и использование mapply() по столбцам. Вывод становится скомпилированным списком статистики тестов: статистика, параметр, значение p, доверительный. интервал, и т.д.

 # FILTER ROWS AND SUBSET NUMERIC COLS group1df <- df[df$group==1, 1:ncol(df)-1] othgroupdf <- df[df$group!=1, 1:ncol(df)-1] # T-TEST FCT tfct <- function(v1, v2){ t.test(v1, v2) } # RUN T-TESTS BY COL, SAVE RESULTS TO LIST ttests <- mapply(tfct, group1df, othgroupdf) 
Давайте будем гением компьютера.