Односторонний ANOVA для l oop: как выполнить итерацию по нескольким столбцам кадра данных? - PullRequest
1 голос
/ 08 апреля 2020

Это мой первый раз здесь, так что go просто! Честно говоря, с учетом того количества времени, которое я потратил на устранение неполадок, я мог бы выполнить каждое из них вручную, но я полон решимости выполнить эту работу ...

Я хочу запустить 71 другой способ ANOVA для сравнения объема из 71 представляющих интерес областей мозга (ROI) с экспериментальной группой (группой). Есть три группы: контроль (1), упругий (2) и восприимчивый (3).

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

> head(df)
# A tibble: 6 x 74
  ID    group whole_brain amygdala arbor_vitae auditory_cortex bed_nuclei
  <chr> <dbl>       <dbl>    <dbl>       <dbl>           <dbl>      <dbl>
1 01mc      1        495.     16.5        5.72            5.29       1.30
2 02mc      1        494.     16.8        5.95            5.29       1.30
3 6mc       1        491.     16.9        5.75            5.31       1.17
4 11mc      1        485.     16.5        5.70            5.04       1.31
5 14mc      1        491.     17.1        6.03            5.06       1.21
6 18mc      1        492.     16.5        6.07            5.12       1.23

Я написал for-l oop, через который я ожидаю, что R будет повторять имя области мозга (каждый столбец , исключая whole_brain), а затем суммируйте таблицу ANOVA:

# One-Way ANOVA -----------------------------------------------------------

for(i in 4:ncol(df)){

  column <- names(df[i]) # to print each ROI at the top of each ANOVA summary

  avz <- aov(df[,i] ~ group, data = df) # Each ANOVA test iterating through each column of my dataframe

  result <- summary(avz) # summarize each ANOVA in a table

  print(column)
  print(result)
}

И все же я получаю это сообщение об ошибке:

Error in model.frame.default(formula = df[, i] ~ group, data = df, drop.unused.levels = TRUE) : 
  invalid type (list) for variable 'df[, i]'

Когда я меняю первый объект (df[,i]) в aov() для имени одной из областей интереса (например, amygdala), вывод дает имя каждого итеративного столбца области интереса с выбранным значением ANOVA (amygdala ~ group, data=df) внизу. Это говорит мне, что for l oop работает, но как мне преодолеть сообщение об ошибке и заставить его систематически сравнивать группу с каждым ROI?

Любая помощь была бы удивительной, даже если указать, что это совершенно старый метод и есть что-то более простое в использовании!

Большое вам спасибо:)

1 Ответ

0 голосов
/ 09 апреля 2020

Похоже, что это не для самого l oop, который не работает, это одна из зависимых переменных, которые вы передаете в aov, является списком, а не цифрой c.

To определить, какие столбцы являются списками, которые вы можете: sapply(df,class) и найти переменные, которые являются списками, и исправить

df$badvariable < - unlist(df$badvariable)

Если вы хотите обновить свой для l oop, чтобы печатать только значимые результаты ANOVA, которые мы можем использовать tidy из library(broom) для суммирования и вывода в аккуратном формате.

for(i in 4:ncol(df))
{

column <- names(df[i])
#tidy will summarise and return neat format
avz <- broom::tidy(aov(df[,i] ~ group, data = df))

# Add this condition if you only want aov with P < 0.05 printed
if(avz$p.value[1] < 0.05) {

  print(column)
  print(avz)
 }
}
...