Сообщения об ошибках при попытке построить сложную функцию в R - PullRequest
0 голосов
/ 22 января 2019

Я написал некоторый код, чтобы продемонстрировать преимущества диверсификации по ряду активов при планировании портфеля.

#Portfolio variance
y <- function(x) {
  vars <- rnorm(n = x, mean = 0.7, sd = 0.07)
    # rho generating function:
    ranrho <- function(z) {
    c(rep(0, times = z), runif(n = x-z, min = -1, max = 0.9)) + 0.1
    }
    #you get the lower diagonal of the covar matrix:
    rhold <- sapply(1:x, ranrho)
    rhold
    #and the full corr matrix
  corr <- rhold + t(rhold)
  corr <- corr * sqrt(vars)
  corr <- t(t(corr) * sqrt(vars))
  #And the variance-covariance matrix:
    vcov <- corr + if(x==1) {vars
    } else {diag(vars)}
  #And recover the portfolio variance through the following equation
    portvar <- (1/x^2)*sum(vars) + if(x==1) { as.numeric(0)
  } else {(1/x^2)*(sum(corr)/2)}
  return(portvar)
}

y(1)
y(5)
y(10)
y(20)
y(50)
y(100)

plot(1:100, y(1:100))

y возвращает одно значение для каждого введенного значения x. х - целое число, представляющее количество активов, а у - последующая дисперсия портфеля. У меня есть примеры для различных значений x, и каждый возвращает разумное значение для y без проблем.

Моя проблема в том, что я получаю следующую ошибку при попытке построить свою функцию:

Ошибка в rhold + t (rhold): недопустимые массивы Дополнительно: предупреждающее сообщение: В 1: x: числовое выражение имеет 100 элементов: используется только первый

Во-первых, поскольку код работает, когда я пишу y ([что угодно]), rhold и t (rhold) явно согласуются. Я не уверен, что означает вторая ошибка. Я неправильно использую функцию заговора?

Другая проблема - я смотрел, но не могу найти, как можно построить функцию, которая принимает только целочисленные значения x в своей области, но возвращает значения y на непрерывной вещественной линии.

Благодарен за любую помощь.

1 Ответ

0 голосов
/ 22 января 2019

Проблема с вашим кодом в том, что ваша функция ожидает однозначное число и вы используете 100

Просто используйте lappy:

#Portfolio variance
y <- function(x) {
  vars <- rnorm(n = x, mean = 0.7, sd = 0.07)
  # rho generating function:
  ranrho <- function(z) {
    c(rep(0, times = z), runif(n = x-z, min = -1, max = 0.9)) + 0.1
  }
  #you get the lower diagonal of the covar matrix:
  rhold <- sapply(1:x, ranrho)
  rhold
  #and the full corr matrix
  corr <- rhold + t(rhold)
  corr <- corr * sqrt(vars)
  corr <- t(t(corr) * sqrt(vars))
  #And the variance-covariance matrix:
  vcov <- corr + if(x==1) {vars
  } else {diag(vars)}
  #And recover the portfolio variance through the following equation
  portvar <- (1/x^2)*sum(vars) + if(x==1) { as.numeric(0)
  } else {(1/x^2)*(sum(corr)/2)}
  return(portvar)
}

y(1)
y(5)
y(10)
y(20)
y(50)
y(100)

plot(1:100,lapply(1:100,y))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...