2016-11-25 4 views
0

Я пытаюсь провести анализ портфеля акций с использованием коротких весов.Ошибка: неверный номер измерения

Для этого мне нужно было создать цикл, который преобразует мои «нормальные» значения в обратный знак (+/-), когда соответствующий вес «короткий» (отрицательный знак).

Матрица mat_weights содержит optimazed weigths из 34 различных портфелей, каждый из которых содержит большее количество акций, которые изменяются в зависимости от процесса оптимизации («Марковица»):

  • первого портфель: 4 запасов
  • второй портфель: 5 акций
  • третий портфель: 6 акций
  • ........
  • тридцать четвёртую портфель: 3 4 акции

Матрица mat_returns_adjusted представляет собой матрицу, которая должна содержать результат контура, который должен быть возвращается corrisponding к каждой акции изменен знак, если вес corrisponding Порфолио является отрицательным. Итак, в конце концов, я смогу получить матрицу размером 1040 (строк) x 34 (столбцов), заполненную «скорректированными» результатами.

Матрица mat_returns_raw содержит возвращение каждого запаса связан с другой матрицей называется Номи, который соединяет правый запас возврат с именем соответствующего запаса

Это цикл обсуждался выше:

for(i in 1:34) { 
mat_weights_short <- (mat_weights[i,1:i+3]) 
mat_returns_adjusted <- matrix (NA,1040,i+3) 
mat_returns_raw <- returns[,nomi[i,1:i+3]] 
if(mat_weights_short[i]<0) { 
mat_returns_adjusted[,i]<- -(mat_returns_raw[,i]) 
} else { 
mat_returns_adjusted[,i]<- mat_returns_raw[,i] 
}} 

Когда я ввожу это в R консоли я получаю сообщение об ошибке:

Error in mat_returns_raw[, i] : incorrect number of dimensions 

Я попытался решить проблему, но до сих пор не смог ее решить. Я заранее извиняюсь, если вопрос не настолько ясен, но это первый раз, когда я должен был использовать R. Любая помощь была бы чрезвычайно оценена !!!

ответ

0

Проблема, скорее всего, mat_returns_raw - это не правильный объект/размер. Попытайтесь сделать это более очевидным.

for(i in 1:34) { 
    mat_weights_short <- (mat_weights[i,1:i+3]) 
    mat_returns_adjusted <- matrix (NA,1040,i+3) 
    mat_returns_raw <- returns[,nomi[i,1:i+3]] 

    ## print updates 
    print(paste0("You're trying to pull column ", i " out of a ", class(mat_returns_raw), " which has ", ncol(mat_returns_raw), " columns")) 
    flush.console() 

    if(mat_weights_short[i]<0) { 
     mat_returns_adjusted[,i]<- -(mat_returns_raw[,i]) 
    } else { 
     mat_returns_adjusted[,i]<- mat_returns_raw[,i] 
    } 
} 

Кроме того, я предлагаю запустить цикл for, набрав i в вашей консоли, чтобы выяснить, какие итерации ошибка происходя в, затем запустить код строка за строкой в ​​for цикле вручную выяснить, где проблема есть, используя такие вещи, как dim() и class() часто искать то, чего вы не ожидаете. Удачи

+0

Я попытался запустить цикл для каждой строки кода, и, по-видимому, проблема связана с ** mat_weights-short **, который, как я запускаю dim(), дает мне результат ** NULL **, и это дает мне ** ошибка («вне границ») **. Любые предложения по устранению проблемы? – Mattias

+0

Я бы удостоверился, что 'length (mat_weights_short)> = 34', это вектор, поэтому вы хотите проверить его с помощью' length' вместо 'dim'.Я предполагаю, что ваш оператор 'if' прослушивается, потому что он ищет итерацию' i' за ее фактическую длину (пример 'i = 21', но' length (mat_weights_short) = 20', поэтому его взгляд на 21 Элемент st и 21-й элемент не существуют, поскольку его длина составляет всего 20). звучит как «вне поля» для меня. – TBSRounder

+0

Я просто запускаю 'length (mat_weights_short)' и равен 34. Фактическая длина - 31, поэтому я добавил ** + 3 ** – Mattias

Смежные вопросы