Я программирую кривую спецификации для моей дипломной работы бакалавра. Чтобы построить график, который показывает, какие комбинации спецификаций показывают значительный результат, а какие нет, я пытаюсь создать цикл, который приводит к тому, что R тестирует все возможные комбинации. Даже если цикл довольно короткий, есть некоторые сообщения об ошибках и не понимают, как решить проблему.
Прежде всего я создал переменные для определения возможных спецификаций:
outlier <- c("none", "40", "33,40,63", "33,40,54,63")
ineligble <- c("28", "28,38,45,48,56")
gender <- c("together", "male", "female")
regression <- c("ANOVA")
control <- c("none", "premanipulation_mean", "all hormones", "all")
Data.frame "спецификации" определяется следующим образом:
specifications <- expand.grid(outlier = outlier, ineligble = ineligble, gender = gender, regression = regression,
control = control)
specifications <- data.frame(specifications, p_value = rep(NA, nrow(specifications)), f_value = rep(NA, nrow(specifications)),
partial_eta_square = rep(NA, nrow(specifications)), r = rep(NA, nrow(specifications)))
Как вы можете видеть, я построил фрейм данных из возможных комбинаций и добавил столбцы для значения p, значения f, частичного квадрата eta и размера эффекта. Чтобы заполнить дополнительные столбцы значениями, я добавил необходимые команды в конце цикла.
Цикл выглядит следующим образом:
for(i in 1:nrow(specifications)){
dat <- ccy
if (specifications$outlier[i] == "none") {
dat <- dat
} else {
if (specifications$outlier[i] == "40") {
dat <- dat[-11,]
} else {
if (specifications$outlier[i] == "33,40,63") {
dat <- dat[-c(5,11,31),]
} else {
if (specifications$outlier[i] == "33,40,54,63") {
dat <- dat[-c(5,11,23,31),]
}
}
}
}
if(specifications$ineligble == "28") {
dat <- ccySC
} else {
if(specifications$ineligble == "28,38,45,48,56") {
dat <- ccy
}
}
if (specifications$gender == "together") {
dat <- dat
} else {
if(specifications$gender == "male"){
dat <- dat[which(dat$gender == "male"),]
} else {
if(specifications$gender == "female") {
dat <- dat[which(dat$gender == "female"),]
}
}
}
if (specifications$regression == "ANOVA") {
if (specifications$control == "none") {
anova <- aov(T_time2_mean ~ posecondition, data = dat)
} else {
if (specifications$control == "premanipulation_mean") {
anova <- aov(T_time2_mean ~ T_time1_mean + posecondition, data = dat)
} else {
if(specifications$control == "all hormones") {
anova <- aov(T_time2_mean ~ T_time1_mean + posecondition + C_time1_mean + C_time2_mean)
} else {
if (specifications$control == "all") {
anova <- aov(T_time2_mean ~ T_time1_mean + posecondition + C_time1_mean + C_time2_mean + sex)
}
}
}
}
specifications$p_value[i] <- drop1(anova, test = "F")$"Pr(>F)"[[3]]
specifications$f_value[i] <- drop1(anova, test = "F")$"F value"[[3]]
specifications$partial_eta_square[i] <- etaSquared(anova, type = 2, anova = F)$"eta.sq.part"[[2]]
specifications$r[i] <- sqrt(specifications$partial_eta_square[i])
specifications$k[i] <- nrow(specifications)
}
}
Итак, я хочу, чтобы он заполнил четыре дополнительных столбца значением p, значением f и т. Д. Но я получаю сообщение об ошибке «Нижний индекс за пределами» для следующей строки:
specifications$p_value[i] <- drop1(anova, test = "F")$"Pr(>F)"[[3]]
Я знаю, что означает сообщение об ошибке, но я не знаю, как его решить. При тестировании одной и той же команды на случайном анове вне цикла это работает.
Используемые данные можно найти по следующей ссылке и называется ccy-source-data:
https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/FMEGS6