在R

时间:2019-04-17 12:38:07

标签: r

关于我的数据集的简介:这是问卷调查数据,其中提到了学生反社会行为的不同原因。我想运行因子分析以组织与因子相似的原因。

例如,一个原因是学生由于父母的教育而具有反社会的行为,而另一个原因是这是由于父母的教育背景而发生的。这两个原因之间有一些相似之处,因此我想知道这两个原因是否可以合并为一个因素,因此我想进行一个因素分析以查看是否可以将一个因素合并不同的原因。

为了进行因子分析,从我的理解出发,除去异常值(小于均值减去3个标准偏差,大于均值加上3个标准偏差的离群值)非常重要。但是,我不确定是否需要问卷数据,如果有必要,或者至少不是完全多余,那么我可以通过哪个R代码达到此目的?

我对中位数绝对偏差(MAD)方法进行了一些研究,这可能会排除异常值。而且我还写了如下的R代码:

mad.mean.D.O <- as.numeric(D.O.Mean.data$D.O_Mean)

median(mad.mean.D.O)

mad(mad.mean.D.O, center = median(mad.mean.D.O), constant = 1.4826,
    na.rm = FALSE, low = FALSE, high = FALSE)

print(Upper.MAD <- (median(mad.mean.D.O)+3*(mad(mad.mean.D.O, center = median(mad.mean.D.O), constant = 1.4826,
                                                na.rm = FALSE, low = FALSE, high = FALSE))))

print(Lower.MAD <- (median(mad.mean.D.O)-3*(mad(mad.mean.D.O, center = median(mad.mean.D.O), constant = 1.4826,
                                                na.rm = FALSE, low = FALSE, high = FALSE))))

D.O.clean.mean.data <- D.O.Mean.data %>%
  select(ID_t,
         anonymity,
         fail_exm,
         pregnant,
         deg_job,
         new_job,
         crowded,
         stu_req,
         int_sub,
         no_org,
         child,
         exm_cont,
         lec_sup,
         fals_exp,
         fin_prob,
         int_pro,
         family,
         illness,
         perf_req,
         abroad,
         relevanc,
         quickcash,
         deg_per,
         lack_opp,
         prac_work,
         D.O_Mean) %>%
  filter(D.O_Mean < 4.197032 & D.O_Mean > 0.282968)

此R代码有效。 但是,我只是想知道是否还有其他方法可以达到相同的目标,但是方法更简单。

此外,我的数据集如下所示:enter image description here

所有变量均为问卷调查数据,以李克特量表计量。所有这些都是反社会行为的原因。例如,最初的参与者,她/他给匿名1,这意味着从不完全正确地来看,他/她认为匿名不完全有助于他/她的反社会行为。

非常感谢您在这里的所有投入。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用此功能删除异常值。它将梳理所有列以识别异常值,因此请确保暂时删除不需要消除异常值的列,您可以稍后cbind()将其退回。

#identify outliers
idoutlier<- function(data, cutoff = 3) {
  # Calculate the sd
  sds <- apply(data, 2, sd, na.rm = TRUE)
  # Identify the cells with value greater than cutoff * sd (column wise)
  result <- mapply(function(d, s) {
    which(d > cutoff * s)
  }, data, sds)
  result
}


#remove outliers
rmoutlier<- function(data, outliers) {
  result <- mapply(function(d, o) {
    res <- d
    res[o] <- NA
    return(res)
  }, data, outliers)
  return(as.data.frame(result))
}


cbind()(如有必要),然后na.omit()以删除异常值