Ошибка функции lapply: индекс за пределами - PullRequest
0 голосов
/ 16 февраля 2019

Я должен сделать карту Кохонена 4 * 4 для проекта.

Однако я получаю ошибку

Ошибка в win_index [1,]: индекс за пределами границ

Кроме того: было 16 предупреждений (для их просмотра используйте предупреждения ())

После тестирования моего кода, я полагаю, что функция lapply (строка 77) нене выполняется правильно, потому что созданная таким образом матрица содержит только NA.И так как эта матрица будет использована позже, результат будет неправильным, потому что в программе присутствует NA.

#############################################
##Function for distance calculation (RMSDA)##
#############################################

RMSDA<-function(data_phipsi,Kohonen_matrix)
{
  difference<-data_phipsi-Kohonen_matrix 
  for(j in 1:length(difference)){
    if (difference[j]< -180) {difference[j]=difference[j]+360}
    if (difference[j]> +180) {difference[j]=difference[j]-360}
  }
  distance=mean(sqrt(difference^2))  
  return(distance) 
}

##############################
## Program ###
##############################

for(step in 1:iteration)
{
  data_phipsi<-data_phipsi[sample(nrow(data_phipsi)),] # Sample vectors of training (samples of lines of the dataframe)
  print(step) #Visualize where we are in loops
  for(k_row in 1:nrow(data_phipsi))
  {
    #Update learn_rate and radius at each row of each iteration
    learn_rate<-learning(initial_rate,((step-1)*nrow(data_phipsi))+k_row,data_phipsi)
    learn_radius<-learning(initial_rate,((step-1)*nrow(data_phipsi))+k_row,data_phipsi)
    #Find distance between each vectors of angles of Kohonen Map and the training vector
    phipsi_RMSDA<-lapply(random_list, RMSDA, data_phipsi=data_phipsi[k_row,])
}

Как можно исправить эту ошибку?

Спасибо,Спасибо.

edit: это единственные полезные элементы для lapply

Для случайного списка мы можем использовать:

random_list <- list(
  c(88, 148, 60, 83, -119, -59, -96, 169),
  c(104, 101, 174, -48, 18, 10, -159, 158),
  c(164, -80, 137, -170, -172, 52, -149, 96),
  c(88, 18, -115, 48, -3, -158, -92, -154),
  c(170, -107, -109, -14, -142, -77, -120, 76),
  c(-121, 15, -46, -145, -128, 74, -166, 44),
  c(46, -178, 67, -88, -125, -130, 88, -11),
  c(131, 147, -32, 103, -16, 116, 78, -125),
  c(75, -95, -137, 133, -97, -134, 126, -105),
  c(115, 173, -82, -135, 134, 82, -143, -43),
  c(111, 13, -54, -53, 103, 132, -13, -43),
  c(-143, 89, -91, -137, -63, 14, -166, 83),
  c(-98, 178, 14, -80, -122, -25, 19, 117),
  c(-113, -97, 34, -178, -56, 18, -167, 84),
  c(49, 82, 50, 168, -157, -154, 51, 78),
  c(173, -4, 164, 125, 31, 115, -74, -92)
)

и пример для data_phipsi [1,]

data_phipsi <- read.table(header = TRUE, text = "
 phi1 psi2 phy2 psi3 phy3 psi4 phy4 psi5  
-24.5 81.9 -155.2 -81.4 127.7 -118 166 -82.1")
data_phipsi
#    phi1 psi2   phy2  psi3  phy3 psi4 phy4  psi5
# 1 -24.5 81.9 -155.2 -81.4 127.7 -118  166 -82.1

1 Ответ

0 голосов
/ 17 февраля 2019

Основная проблема заключалась в том, что последующая команда (вернитесь в редактировании вопроса для строки кода win_index, если интересно) не выполнялась, поскольку результаты lapply были подозрительными.

Устранение неполадок, при которых обнаружена проблема:

  • при возникновении ошибки значения random_list и data_phipsi[k_row,] были разумными и не подозрительными; однако
  • , вывод lapply было все NA

Итак, погрузившись в функцию RMSDA, было замечено, что difference выглядел хорошо вплоть до

distance=mean(sqrt(difference^2))  

, и в этот момент все перевернулось- NA.Проблема в том, что данные все еще были в форме фрейма, поэтому mean не удался (просто попробуйте mean(mtcars), чтобы увидеть).(Следует также отметить, что я считаю, что sqrt(difference^2) эквивалентно abs(difference).)

Замена этой строки RMSDA на

distance=mean(abs(unlist(difference)))

, похоже, устранила проблему (критическая часть unlist).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...