#r
#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 amp; D.O_Mean > 0.282968)
Этот R-код работает.
Однако мне просто интересно, существуют ли другие методы, которые могли бы достичь той же цели, но при более простом подходе.
Кроме того, мой набор данных выглядит следующим образом:
Все переменные представляют собой данные анкеты, измеряемые по шкале Лайкерта. И все это является причиной антиобщественного поведения. Например, первые участники, они / она дают 1 анонимности, что означает, что не совсем точно, он / она считает, что анонимность не совсем способствует его / ее антиобщественному поведению.
Я был бы очень благодарен за весь ваш вклад здесь.
Комментарии:
1. Я не думаю, что вам следует удалять выбросы, полученные из вопросника, который, по-видимому, имеет ограниченный набор вариантов. И если вы пытаетесь обнаружить антисоциальное поведение (что является необычным поведением), возможно, это те, которые проявляются как отклонения.
2. Вы должны поделиться данными с
dput(head(df,n))
изображением и удалить его.3. что представляет собой код dput(head(df,n)) для кода dput(head(df,n))? номер столбца? Не могли бы вы поделиться со мной примером того, как поделиться данными без изображения?
4. Спасибо за вашу идею. Причина, по которой я подумал об удалении выбросов, заключается в том, что я знаю, что на факторный анализ легко влияют влиятельные выбросы, но я не уверен, работает ли он так же с данными вопросника. Поэтому на всякий случай я хотел бы это проверить.
Ответ №1:
Вы можете попробовать эту функцию для удаления выбросов. Он прочешет все столбцы для выявления выбросов, поэтому не забудьте временно удалить столбцы, которые не нуждаются в удалении выбросов, и вы можете 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()
для удаления ваших выбросов