ezANOVA:1)如何省略数据? 2)省略na数据后仍然收到错误信息?

时间:2012-12-21 01:47:34

标签: r dataset missing-data na

对于使用lme函数的重复度量分析,我可以使用以下命令省略不可用(na)数据。na.action=na.omit

anova_lme_loc<-lme(data=rm1, fixed=Nmin~location*date, random=~1|subject,
                   na.action=na.omit)

但是,当我尝试使用ezANOVA功能时,我收到了以下通知:

anova_ez_loc=ezANOVA(data=rm1, dv=Nmin, wid=subject, within=date, 
                     between=location, na.action=na.omit)
  

ezANOVA出错(data = rm1,dv = Nmin,wid = subject,= = date,:     未使用的参数(na.action = na.omit)

如何在ezANOVA中省略我的na数据? - 解决使用:

rm1_na <- na.omit(rm1)

但现在我收到以下错误:

  

anova_ez_loc = ezANOVA(data = rm1_na,dv = Nmin,wid = subject,within = date,between = location)

     

警告:将“主题”转换为ANOVA因子。

     

警告:数据不平衡(每组不等N)。确保为ezANOVA()的type参数指定了一个考虑周全的值。

     

ezANOVA_main出错(data = data,dv = dv,wid = wid,within = within,:     一个或多个单元格缺少数据。尝试使用ezDesign()检查数据。

2 个答案:

答案 0 :(得分:2)

ezANOVA无法处理缺失的数据,因为作者在this reponse中概述了类似的问题。您有两种选择:

  1. 手动删除缺失的数据。函数complete.cases可能会有所帮助。
  2. Mike Lawrence建议从同一个软件包中查看ezMixed,这个软件包更复杂,但可以处理丢失的数据。
  3. 要手动删除数据,您可以执行以下操作:

    rm1.complete <- rm1[complete.cases(rm1),]
    

    然后在分析中使用rm1.complete

答案 1 :(得分:0)

@Jonathan Christensen答案的补充:

使用内部主题因素时,complete.cases不起作用,因为它会逐行考虑案例,而您需要删除包含不完整案例ID的所有行。

这是一个小脚本,它将complete.cases扩展到一个名为complete.cases.within的自定义函数,该函数可以为您完成所有操作:

if(!require(tidyverse)) install.packages("tidyverse"); library(tidyverse) #useful package for clean code

#helper function that returns ALL indices of matches of x in table instead of just the first one
#we need this to get all rows containing the ID of incomplete cases.
matchAll = function(x, table, nomatch=NA_integer_, incomparables=NULL) {
  which(!is.na(match(table, x, nomatch, incomparables)))
}

complete.cases.within = function(data, dv, wid) {
  incomplete = data %>% select(dv) %>% complete.cases() %>% !. #boolean vector containing incomplete rows
  toRemove = data %>% select(wid) %>% filter(incomplete) %>% .[,1] %>% unique() #all IDs containing incomplete rows
  positions = matchAll(toRemove, data[,wid])
  return(if (length(positions)==0) data else data[-positions,]) #drop all rows matching toRemove IDs
}