Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将函数应用于因子(参和者)的每一级,根据与R中标准偏差平均值的距离去除异常值_R_Dataframe_Outliers - Fatal编程技术网

将函数应用于因子(参和者)的每一级,根据与R中标准偏差平均值的距离去除异常值

将函数应用于因子(参和者)的每一级,根据与R中标准偏差平均值的距离去除异常值,r,dataframe,outliers,R,Dataframe,Outliers,我在R中有一个data.frame,其中一列表示实验中的参与者受试者,另一列表示条件,试验类型,最后一列表示我的数值因变量rt 以下是使用dput()函数为我的data.frame的前64行生成的数据的可复制示例: structure(list(subject = structure(c(21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 24L, 24L, 24L, 24L, 24

我在R中有一个data.frame,其中一列表示实验中的参与者
受试者
,另一列表示
条件
试验类型
,最后一列表示我的数值因变量
rt

以下是使用
dput()
函数为我的data.frame的前64行生成的数据的可复制示例:

 structure(list(subject = structure(c(21L, 21L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 24L, 24L, 
24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 
24L, 27L, 27L, 27L, 27L, 27L, 27L, 27L, 27L, 27L, 27L, 27L, 27L, 
27L, 27L, 27L, 27L, 47L, 47L, 47L, 47L, 47L, 47L, 47L, 47L, 47L, 
47L, 47L, 47L, 47L, 47L, 47L, 47L), .Label = c("1p12", "1p13", 
"1p15", "1p30", "1p36", "1p39", "1p43", "1p46", "1p49", "1p59", 
"1p60", "1p67", "1p69", "1p79", "1p80", "1p81", "1p84", "1p85", 
"1p88", "1p9", "2p1", "2p11", "2p18", "2p2", "2p22", "2p25", 
"2p3", "2p31", "2p33", "2p42", "2p44", "2p5", "2p50", "2p58", 
"2p63", "2p72", "2p76", "2p78", "2p8", "2p83", "3p10", "3p16", 
"3p20", "3p28", "3p32", "3p34", "3p4", "3p41", "3p47", "3p54", 
"3p55", "3p56", "3p61", "3p64", "3p66", "3p7", "3p77", "3p82", 
"3p86", "3p87", "4p14", "4p17", "4p19", "4p21", "4p24", "4p26", 
"4p27", "4p29", "4p35", "4p37", "4p38", "4p48", "4p51", "4p57", 
"4p6", "4p62", "4p68", "4p70", "4p74", "4p75"), class = "factor"), 
    rt = c(4303L, 5616L, 1317L, 1663L, 1353L, 645L, 648L, 457L, 
    2359L, 2497L, 832L, 523L, 1427L, 511L, 483L, 1300L, 873L, 
    1185L, 1752L, 2037L, 4849L, 2975L, 1621L, 1235L, 3008L, 1560L, 
    1075L, 4596L, 1129L, 1093L, 1302L, 1414L, 5542L, 2369L, 4944L, 
    2338L, 1274L, 1837L, 3384L, 1338L, 2002L, 1756L, 2516L, 1868L, 
    2017L, 1337L, 1106L, 1388L, 6812L, 5579L, 1695L, 1976L, 1897L, 
    4484L, 3095L, 1865L, 2283L, 1659L, 1328L, 1882L, 1483L, 1993L, 
    1776L, 2256L), condition = structure(c(1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("reliable", 
    "unreliable"), class = "factor"), trial_type = structure(c(2L, 
    2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 
    2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 
    2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 
    1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 
    1L, 2L, 2L), .Label = c("same", "switch"), class = "factor"), 
    accuracy = c(0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 
    1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 
    0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 
    1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 1L, 
    1L, 0L, 1L, 1L, 0L, 1L, 0L, 1L)), row.names = c(NA, -64L), class = c("tbl_df", 
"tbl", "data.frame"))
我想根据
rt
中每个分数与每个参与者的平均值(以标准偏差单位)的距离来删除异常值。每个参与者有16行,有80个参与者。R正确地将给定参与者的16行中的每一行解释为因子的单个级别

我想用它分别为
受试者
中的每个级别和
试验类型
中的每个级别从
rt
中删除异常值。我用来消除所有参与者的异常值的公式是:

# Calculate mean and `sd` for each level of `trial_type`

# For 'same':

MeanSame <- mean(RTs$rt[RTs$trial_type == "same"])
SDSame <- sd(RTs$rt[RTs$trial_type == "same"])

# For 'switch':

MeanSwitch <- mean(RTs$rt[RTs$trial_type == "switch"])
SDSwitch <- sd(RTs$rt[RTs$trial_type == "switch"])

# Create upper and lower cut for level 'same' of 'trial_type':
UpperSame <- MeanSame + 2.5*SDSame
LowerSame <- MeanSame - 2.5*SDSame

# Create upper and lower cut for level 'switch' of 'trial_type':
UpperSwitch <-2.5*SDSwitch + MeanSwitch
LowerSwitch <- MeanSwitch - 2.5*SDSwitch


#Identify Outliers in Same

OutliersSameUpper <- which(RTs$rt > UpperSame & RTs$trial_type == "same") 

OutliersSameLower <- which(RTs$rt < LowerSame & RTs$trial_type == "same")


# Identify Outliers in Switch

OutliersSwitchUpper <- which(RTs$rt > UpperSwitch  & RTs$trial_type == "switch") 

OutliersSwitchLower <- which(RTs$rt < LowerSwitch & RTs$trial_type == "switch")


# Create new data.frame without the identified outliers:

RTsClean <- RTs[-c(OutliersSameUpper,OutliersSameLower,OutliersSwitchUpper,OutliersSwitchLower),]
#计算每个“试验”类型水平的平均值和“sd”`
#对于“相同”:

根据OP的要求,平均值相同

如果有人能帮助我找到最好的方法来应用我在上面指定的异常值移除方法,我将不胜感激,但这种方法可以单独应用于主题向量的每个级别。这意味着需要为每个受试者级别指定平均值和sd变量

它删除三行作为异常值


图书馆(dplyr)
RTs%%>%分组依据(受试者)%%>%
过滤器(rt=平均值(rt)-(2.5*sd(rt)))
#>#A tibble:61 x 5
#>#分组:受试者[4]
#>受试者rt条件试验类型精度
#>                      
#>1 2p1 4303可靠开关0
#>2 2p1 1317可靠开关0
#>3 2p1 1663可靠性相同1
#>4 2p1 1353可靠开关1
#>5 2p1 645可靠的相同1
#>6 2p1 648可靠性相同1
#>7 2p1 457可靠相同1
#>8 2p1 2359可靠开关0
#>9 2p1 2497可靠开关0
#>10 2p1 832可靠相同的1
#> # ... 还有51行
基于OP的进一步要求

如果可能,最好在data.frame中创建一个新列,指定rt中的每一行,不管该行是否被视为异常值。但我不知道如何才能做到这一点


基于OP的这一要求

如果有人能帮助我找到最好的方法来应用我在上面指定的异常值移除方法,我将不胜感激,但这种方法可以单独应用于主题向量的每个级别。这意味着需要为每个受试者级别指定平均值和sd变量

它删除三行作为异常值


图书馆(dplyr)
RTs%%>%分组依据(受试者)%%>%
过滤器(rt=平均值(rt)-(2.5*sd(rt)))
#>#A tibble:61 x 5
#>#分组:受试者[4]
#>受试者rt条件试验类型精度
#>                      
#>1 2p1 4303可靠开关0
#>2 2p1 1317可靠开关0
#>3 2p1 1663可靠性相同1
#>4 2p1 1353可靠开关1
#>5 2p1 645可靠的相同1
#>6 2p1 648可靠性相同1
#>7 2p1 457可靠相同1
#>8 2p1 2359可靠开关0
#>9 2p1 2497可靠开关0
#>10 2p1 832可靠相同的1
#> # ... 还有51行
基于OP的进一步要求

如果可能,最好在data.frame中创建一个新列,指定rt中的每一行,不管该行是否被视为异常值。但我不知道如何才能做到这一点


在这里,您可以通过
groupby
summary
获得结果。 您可以根据需要调整->任何内容:

library(dplyr)
RTs %>% 
  group_by(subject, trial_type) %>% 
  summarise(mean= mean(rt), sd = sd(rt), Upper = 2.5*sd + mean, Lower = mean - 2.5*sd,
            OutliersUpper <- rt > Upper, OutliersLower <- rt < Lower)
库(dplyr)
RTs%>%
分组依据(受试者、试验类型)%>%
总结(平均值=平均值(rt),标准差=标准差(rt),上限值=2.5*sd+平均值,下限值=平均值-2.5*sd,
异常值上限,异常值下限%
总结(平均值=平均值(rt),标准差=标准差(rt),上限值=2.5*sd+平均值,下限值=平均值-2.5*sd,

离群值越高,离群值越低在这里,您可以通过
groupby
summary
获得结果。 您可以根据需要调整->任何内容:

library(dplyr)
RTs %>% 
  group_by(subject, trial_type) %>% 
  summarise(mean= mean(rt), sd = sd(rt), Upper = 2.5*sd + mean, Lower = mean - 2.5*sd,
            OutliersUpper <- rt > Upper, OutliersLower <- rt < Lower)
库(dplyr)
RTs%>%
分组依据(受试者、试验类型)%>%
总结(平均值=平均值(rt),标准差=标准差(rt),上限值=2.5*sd+平均值,下限值=平均值-2.5*sd,
异常值上限,异常值下限%
总结(平均值=平均值(rt),标准差=标准差(rt),上限值=2.5*sd+平均值,下限值=平均值-2.5*sd,

离群值越高,离群值越低其他答案的概括版本

首先,将现有筛选转换为函数:

dropOutliers <- function(.x, .y, multiplier=2.5) {
  limits <- .x %>% 
              group_by(trial_type) %>% 
              summarise(
                SD=sd(rt), 
                Mean=mean(rt), 
                Lower=Mean - multiplier * SD, 
                Upper=Mean + multiplier * SD
              )
  .x %>% 
    left_join(
      limits, 
      by="trial_type"
    ) %>% 
    filter(rt >= Lower && rt <= Upper) %>% 
    select(-SD, -Mean, -Upper, -Lower)
}
这似乎不会删除任何行,因此应用更深入的筛选来检查:

d %>% group_by(subject) %>% group_map(dropOutliers, multiplier=1) %>% bind_rows()
# A tibble: 16 x 4
      rt condition trial_type accuracy
   <int> <fct>     <fct>         <int>
 1   873 reliable  switch            1
 2  1185 reliable  same              1
 3  1752 reliable  same              1
 4  2037 reliable  same              1
 5  4849 reliable  switch            1
 6  2975 reliable  switch            0
 7  1621 reliable  switch            0
 8  1235 reliable  same              1
 9  3008 reliable  switch            0
10  1560 reliable  same              1
11  1075 reliable  switch            0
12  4596 reliable  same              1
13  1129 reliable  same              1
14  1093 reliable  switch            0
15  1302 reliable  same              1
16  1414 reliable  switch            0
d%%>%groupby(subject)%%>%groupmap(dropOutliers,乘数=1)%%>%bind\u行()
#一个tibble:16 x 4
rt条件试验类型精度
1873可靠开关1
2 1185可靠相同的1
3 1752可靠相同的1
4 2037可靠相同1
5 4849可靠开关1
6 2975可靠开关0
7 1621可靠开关0
8 1235可靠相同1
9 3008可靠开关0
10 1560可靠相同的1
11 1075可靠开关0
12 4596可靠相同1
13 1129可靠的相同1
14 1093可靠开关0
15 1302可靠的相同1
16 1414可靠开关0

其他答案的概括版本

首先,将现有筛选转换为
RTs %>% 
  group_by(subject, trial_type, condition, accuracy) %>% 
  summarise(mean= mean(rt), sd = sd(rt), Upper = 2.5*sd + mean, Lower = mean - 2.5*sd,
            OutliersUpper <- rt > Upper, OutliersLower <- rt < Lower)
dropOutliers <- function(.x, .y, multiplier=2.5) {
  limits <- .x %>% 
              group_by(trial_type) %>% 
              summarise(
                SD=sd(rt), 
                Mean=mean(rt), 
                Lower=Mean - multiplier * SD, 
                Upper=Mean + multiplier * SD
              )
  .x %>% 
    left_join(
      limits, 
      by="trial_type"
    ) %>% 
    filter(rt >= Lower && rt <= Upper) %>% 
    select(-SD, -Mean, -Upper, -Lower)
}
d %>% group_by(subject) %>% group_map(dropOutliers) %>% bind_rows()
d %>% group_by(subject) %>% group_map(dropOutliers, multiplier=1) %>% bind_rows()
# A tibble: 16 x 4
      rt condition trial_type accuracy
   <int> <fct>     <fct>         <int>
 1   873 reliable  switch            1
 2  1185 reliable  same              1
 3  1752 reliable  same              1
 4  2037 reliable  same              1
 5  4849 reliable  switch            1
 6  2975 reliable  switch            0
 7  1621 reliable  switch            0
 8  1235 reliable  same              1
 9  3008 reliable  switch            0
10  1560 reliable  same              1
11  1075 reliable  switch            0
12  4596 reliable  same              1
13  1129 reliable  same              1
14  1093 reliable  switch            0
15  1302 reliable  same              1
16  1414 reliable  switch            0