У меня есть фрейм данных, содержащий суждения о сходстве пар голосов от 9 слушателей. Я пытаюсь запустить многомерное масштабирование, чтобы увидеть множественные отношения между голосами на сюжете с масштабированием индивидуальных различий. Я использую пакет smacof.
фрейм данных: https://gist.github.com/al3ka/2b4948d4c13baecae75880dd7f1d5e2c
Вот мой код:
# Get unique voices
voices <- unique(c(results$voice1, results$voice2))
# Number of voices
n_voices <- length(voices)
# Create a list to hold each subject's dissimilarity matrix
dissimilarity_list <- list()
# Create a square dissimilarity matrix for each subject
for (subject_id in unique(results$subject)) {
# Filter responses for the current subject
subject_responses <- results %>% filter(subject == subject_id)
# Initialize an empty matrix
dissimilarity_matrix <- matrix(NA, nrow = n_voices, ncol = n_voices,
dimnames = list(voices, voices))
# Fill the matrix with responses
for (i in 1:nrow(subject_responses)) {
voice1 <- subject_responses$voice1[i]
voice2 <- subject_responses$voice2[i]
response <- subject_responses$response[i]
dissimilarity_matrix[voice1, voice2] <- response
dissimilarity_matrix[voice2, voice1] <- response # Assuming symmetry
}
# Append to the list
dissimilarity_list[[subject_id]] <- dissimilarity_matrix
}
# Convert list of matrices to 3D array
dissimilarity_array <- array(NA, dim = c(n_voices, n_voices, length(dissimilarity_list)))
for (i in 1:length(dissimilarity_list)) {
dissimilarity_array[,,i] <- dissimilarity_list[[i]]
}
# Replace NA values with 0 in the dissimilarity matrices
dissimilarity_array[is.na(dissimilarity_array)] <- 0
# Perform Individual Differences Scaling (INDSCAL)
indscal_result <- smacofIndDiff(dissimilarity_array, ndim = 2)
В тот момент, когда я пытаюсь создать массив, я получаю ошибку:
Ошибка: достигнут предел векторной памяти в 16,0 Гб, см. mem.maxVSize().
Несмотря на то, что мой список составляет около 0,09 ГБ. У меня совершенно новый MBair, и раньше я имел дело с гораздо большими наборами данных. Как я могу обойти эту ошибку? Есть ли способ провести MDS для нескольких слушателей, не создавая средний балл для каждой пары голосов, поскольку это могло бы запутать некоторые различия в данных?
Раньше я запускал это в SPSS, и у меня не было проблем, но я не знаю, как обрабатывать несколько прослушивателей в этой реализации в R без создания массива, что, как я полагаю, заставляет меня сталкиваться с проблемами с памятью. Пожалуйста помоги!
добавил ссылку на GitHub со структурой фрейма данных, надеюсь, это поможет!





Ваша проблема была вызвана индексацией в dissimilarity_list с очень большими числами (идентификаторы субъектов представляют собой большие числа), в результате чего был создан огромный список (где у вас всего 9 субъектов), и в результате последующая матрица стала бы более 16 ГБ. Поэтому, чтобы решить ваши проблемы, преобразуйте идентификаторы субъекта в текст, когда вы используете их для создания списка, т.е.
dissimilarity_list[[as.character(subject_id)]] <- dissimilarity_matrix
Спасибо! Это решило эту проблему. Теперь у меня возникли проблемы со следующей ошибкой: > indscal_result <- smacofIndDiff(dissimilarity_array, ndim = 3) Ошибка в матрице(1, n, n) : нечисловой размер матрицы. Я знаю, если это связано с преобразованием символов, которое каким-то образом хранится в массиве?
попробуйте запустить свой код, используя только предоставленные вами данные, и оцените, воспроизводит ли он вашу проблему; если не; подумайте, как сделать вашу проблему воспроизводимой