簡體   English   中英

循環的單向方差分析:如何遍歷 dataframe 的多列?

[英]One-way ANOVA for loop: how do I iterate through multiple columns of a dataframe?

這是我第一次來這里,所以 go 很容易,老實說,我花了很多時間進行故障排除,我可以手動完成每一個。 但我決心完成這項工作....

我想運行 71 種不同的單向方差分析,比較 71 個大腦感興趣區域 (ROI) 與實驗組 (group) 的體積。 共有三組:控制(1),彈性(2)和易感(3)。

我的小標題 dataframe 看起來像這樣:

> 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 循環,我希望 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]'

當我將 aov aov() ) 中的第一個 object ( df[,i] )交換為其中一個 ROI 的名稱(例如amygdala )時,output 給出每個迭代 ROI 列名稱,並使用所選的方差分析( amygdala ~ group, data=df ) 下面。 這告訴我 for 循環有效,但我如何克服錯誤消息並讓它系統地將組與每個 ROI 進行比較?

任何幫助都會令人驚嘆,甚至指出這是否是一種完全古老的方法並且有一些更容易使用的方法!

太感謝了:)

看起來它不是 for 循環本身不起作用,它是您傳遞給 aov 的因變量之一是一個列表而不是數字。

要確定哪些列是列表,您可以: sapply(df,class)並查找列表變量並修復

df$badvariable < - unlist(df$badvariable)

如果您想更新您的 for 循環以僅打印重要的 ANOVA 結果,我們可以使用tidy from library(broom)進行總結,並以整潔的格式使用 output。

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)
 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM