如何使用!!sym在经历for循环的 Dataframe 上执行shapiro_test时是什么时候?

ulydmbyx  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(85)

我试图循环通过一个dataframe和运行统计摘要,测试和图形通过循环通过dataframe内的某些列的图。我是r中for循环的新手,有点理解!!sym但仍在学习它。询问如何使用它时,作为夏皮罗测试的一部分计算均值差的建议?
例如,在示例数据集中,我想运行配对t检验,以查看每个样本的治疗A和B是否对“效果”、“摄入量”、“温度”有任何影响;但首先需要确定我的数据集是否正态分布。因此我在下面的代码中使用shapiro.test。
Excel工作表中的示例数据集

ID Treatment Effect Intake Count Temperature
1  A         0.1    1      8     20
1  B         0.4    3      9     21
2  A         0.1    3      0     27
2  B         0.2    4      5     28
3  A         0.4    1      14    21
3  B         0.6    4      4     23
...          ...    ...    ...   ...
library(tidyverse)
library(readxl)

df <- read_excel(paste0(getwd(),"/Data.xlsm"), sheet="data")

for (i in c("Effect","Intake", "Temperature")){

#other code is here for means, etc.

#code for shapiro test where i am having the issue

  mean_diff <- with(df, (!!sym(i))[Treatment == "A"] - (!!sym(i))[Treatment == "B"])
  s_test <- tidy(shapiro.test(mean_diff))

#other code to graph
}

我在mean_diff代码处得到的错误:

Error in !sym(i) : invalid argument type
wwtsj6pe

wwtsj6pe1#

这是一个基于tidyverse和随机数据(使用您的原始变量名)的解决方案,因为我在您的编辑可见之前编写了它。

library(tidyverse)

df <- tibble(
  Treatment = rep(c("Saline", "CNO"), each = 5),
  Poke_Time = rnorm(10),
  Retrieval_Time = rnorm(10)
)

df %>% 
  summarise(
    across(
      -Treatment, 
      function(x) {
        y <- df %>% filter(Treatment == "Saline") %>% pull(cur_column())
        z <- df %>% filter(Treatment == "CNO") %>% pull(cur_column())
        shapiro.test(y - z)$p.value
      }
    )
  )
# A tibble: 1 × 2
  Poke_Time Retrieval_Time
      <dbl>          <dbl>
1     0.586          0.600

如果愿意,可以编辑代码以提供p.value以外的摘要。您甚至可以使用list(shapiro.test( y - z))捕获shapiro.test的整个输出。

doinxwow

doinxwow2#

这里不需要for()-loop和!!sym()。通过一点旋转,您可以排列数据以应用处理之间的差异并应用shapiro.test()

library(tidyverse)

df_diff <- df |>
  select(-Count) |> 
  pivot_longer(-c(ID, Treatment), names_to = "measurement") |> 
  pivot_wider(names_from = Treatment,
              values_from = value) |> 
  mutate(diff = A - B) 

df_diff |> 
  summarise(W = shapiro.test(diff)$statistic,
            p = shapiro.test(diff)$p.value,
            .by = measurement)
#> # A tibble: 3 × 3
#>   measurement     W     p
#>   <chr>       <dbl> <dbl>
#> 1 Effect       1     1.00
#> 2 Intake       1     1.00
#> 3 Temperature  0.75  0

相关问题