Вопрос или проблема
У меня возникла проблема с использованием R markdown, из-за которой я не могу визуализировать PCA, разрабатываемую в моем коде. Код размещен ниже, но при попытке создать биплоты я постоянно получаю ошибку “Ошибка в scores[, choices] : индекс вне пределов массива”. Буду признателен за любую помощь.
---
title: "Скрипт диссертации 2"
author: "CJLake"
date: '2024-10-08'
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
Необходимые библиотеки
```{r}
library(archdata)
library(RcmdrMisc)
library(DescTools)
library(foreign)
library(MASS)
library(Hmisc)
library(class)
library(VIM)
library(readxl)
library(biotools)
library(mvoutlier)
library(rrcov)
library(candisc)
library(leaps)
library(mice)
library(VIM)
library(factoextra)
library(Morpho)
library(dplyr)
```
Обработка данных
```{r}
#Чтение файла
Dissertation_Data<- read_excel("/Users/Caroline/OneDrive/Documents/Dissertation Data/Dissertation Data Final.xlsx", na="NA")
#Матрица числовых переменных
diss_variables<-as.matrix(Dissertation_Data[,7:469])
mode(diss_variables)<-"numeric"
#Создание матрицы меток для биплота
labels<-Dissertation_Data[(1:324),1:6]
```
Средние оценки признаков по группам
```{r}
S_ML<-diss_variables[c(1:324),c(1:8,25:32,49:56,73:80)]
S_MP<-diss_variables[c(1:324),c(9:16,33:40,57:64,81:88)]
S_ME<-diss_variables[c(1:324),c(17:24,41:48,65:72,89:96)]
E_ML<-diss_variables[c(1:324),c(97:104,121:128,145:152)]
E_MP<-diss_variables[c(1:324),c(105:112,129:136,153:160)]
E_ME<-diss_variables[c(1:324),c(113:120,137:144,161:168)]
H_ML<-diss_variables[c(1:324),c(169:176,193:200)]
H_MP<-diss_variables[c(1:324),c(177:184,201:208)]
H_ME<-diss_variables[c(1:324),c(185:192,209:216)]
K_ML<-diss_variables[c(1:324),c(217:224,241:248,265:272)]
K_MP<-diss_variables[c(1:324),c(225:232,249:256,273:280)]
K_ME<-diss_variables[c(1:324),c(233:240,257:264,281:288)]
V_MO_T<-diss_variables[c(1:324),c(289:408)]
V_MO_L<-diss_variables[c(1:324),c(409:463)]
```
Удаление NA
```{r}
S_ML_omit<-na.omit(S_ML)
S_MP_omit<-na.omit(S_MP)
S_ME_omit<-na.omit(S_ME)
E_ML_omit<-na.omit(E_ML)
E_MP_omit<-na.omit(E_MP)
E_ME_omit<-na.omit(E_ME)
H_ML_omit<-na.omit(H_ML)
H_MP_omit<-na.omit(H_MP)
H_ME_omit<-na.omit(H_ME)
K_ML_omit<-na.omit(K_ML)
K_MP_omit<-na.omit(K_MP)
K_ME_omit<-na.omit(K_ME)
V_MO_T_omit<-na.omit(V_MO_T)
V_MO_L_omit<-na.omit(V_MO_L)
```
Средние значения групп оценок признаков
```{r}
S_ML_Score<-mean(unlist(S_ML_omit))
S_MP_Score<-mean(unlist(S_MP_omit))
S_ME_Score<-mean(unlist(S_ME_omit))
E_ML_Score<-mean(unlist(E_ML_omit))
E_MP_Score<-mean(unlist(E_MP_omit))
E_ME_Score<-mean(unlist(E_ME_omit))
H_ML_Score<-mean(unlist(H_ML_omit))
H_MP_Score<-mean(unlist(H_MP_omit))
H_ME_Score<-mean(unlist(H_ME_omit))
K_ML_Score<-mean(unlist(K_ML_omit))
K_MP_Score<-mean(unlist(K_MP_omit))
K_ME_Score<-mean(unlist(K_ME_omit))
V_MO_T_Score<-mean(unlist(V_MO_T_omit))
V_MO_L_Score<-mean(unlist(V_MO_L_omit))
```
Составные баллы регионов
```{r}
S_Comp<-S_ML_Score+S_MP_Score+S_ME_Score
```
PCA композитного региона плеча
```{r}
S_Comp.pca<-prcomp(S_Comp,scale=FALSE)
#Метки
row.index_S_ML<-which(rowSums(is.na(S_ML))>0)
SM_Comp_labels<-labels[-row.index_S_ML,]
#Биплот
biplot(S_Comp.pca, choices=1:2, xlabs=S_ML_Comp_labelsl$Cohort, pc.biplot=FALSE)
#Построение PCA
S_Comp_ord<-cbind(S_Comp.pca$x[,1],S_Comp.pca$x[,2])
plot(S_Comp_ord,pch=20,col=rainbow(9)[S_ML_Omit_labels$Cohort],asp=1,cex=1,xlab="PC1",ylab="PC2")
text(S_Comp_ord,label=S_ML_omit_labels$Cohort,col=rainbow(9)[S_ML_omit_labels$Cohort],cex=1,pos=2)
```
Я пытался создать метки, используя оригинальный набор данных, а затем набор данных, в котором были устранены оценки NA. Это, похоже, не имело значения, я продолжал получать одну и ту же ошибку.
Ответ или решение
Ваша проблема, связанная с ошибкой "Error in scores[, choices] : subscript out of bounds", может быть вызвана несколькими причинами в коде R Markdown. Давайте разберем ваши шаги и укажем на возможные источники проблемы. Я предложу исправления, чтобы вы могли успешно построить биплот для вашего PCA.
Анализ кода
-
Выборка данных для PCA:
Прежде всего, вам нужно быть уверенным, что данные, которые вы подаете на вход функцииprcomp
, являются правильно структурированными. Вы собираетесь использовать переменные изS_Comp
, однако это скалярное значение (сумма), а не матрица признаков. Вам следует использовать соответствующие данные, которые представляют собой набор признаков (например,S_ML_omit
,S_MP_omit
и т.д.). -
Создание матрицы признаков:
Вместо того, чтобы агрегировать значения вS_Comp
, создайте одну матрицу для PCA, которая содержит все ваши данные для PCA. Это может выглядеть следующим образом:S_Comp_data <- rbind(S_ML_omit, S_MP_omit, S_ME_omit)
Исправление кода
Ниже приведен исправленный код для выполнения PCA и построения биплота:
# Применение PCA к таблице с полными данными
S_Comp_data <- rbind(S_ML_omit, S_MP_omit, S_ME_omit) # Объедините ваши данные в одну матрицу
S_Comp.pca <- prcomp(S_Comp_data, scale = TRUE) # Обратите внимание, что масштабирование обычно рекомендуется
# Создание меток для биплота
row.index_S_ML <- which(rowSums(is.na(S_ML)) > 0)
SM_Comp_labels <- labels[-row.index_S_ML, ]
# Проверьте, что у вас есть нужные метки
if (nrow(SM_Comp_labels) != nrow(S_Comp.pca$x)) {
stop("Количество меток и точек PCA не совпадает. Проверьте данные.")
}
# Биплот
biplot(S_Comp.pca, choices = 1:2, xlabs = SM_Comp_labels$Cohort, pc.biplot = FALSE)
# Построение PCA
S_Comp_ord <- S_Comp.pca$x[, 1:2] # Получение первых двух компонент
plot(S_Comp_ord, pch = 20, col = rainbow(9)[SM_Comp_labels$Cohort], asp = 1, cex = 1, xlab = "PC1", ylab = "PC2")
text(S_Comp_ord, label = SM_Comp_labels$Cohort, col = rainbow(9)[SM_Comp_labels$Cohort], cex = 1, pos = 2)
Подсказки и рекомендации
-
Убедитесь в корректности данных: Проверьте, что ни в одной из моделей (например,
S_ML
,S_MP
и т.д.) нет NA-значений перед их объединением. Это может не только вызвать ошибки, но и повлиять на правильность вашего PCA. -
Масштабирование: Обычно для PCA рекомендуется масштабирование данных. Попробуйте установить
scale = TRUE
, чтобы иметь возможность работать с данными, которые имеют различные масштабы. -
Отладка: Если все равно возникает ошибка, добавьте отладочные печати (
print(dim(S_Comp.pca$x))
), чтобы удостовериться, что количество строк в матрице PCA и метках совпадает.
Следуя этим рекомендациям, вы сможете успешно завершить ваш анализ PCA и построить биплот. Не стесняйтесь задавать дополнительные вопросы. Удачи в вашем исследованиях!