簡體   English   中英

r-loops``tmp *`下標超出范圍

[英]r-loops-`*tmp*` subscript out of bounds

我正在使用slove.QP解決二次問題(資產分配問題)。 我對預期收益的不同范圍有四個限制。 例如,對於從6.1到6.5的返回范圍,我對該范圍施加了約束,對於從6.6到7.0的范圍,我對其施加了另一個約束,依此類推。

我創建一個約束矩陣,它看起來像這樣:

min max min max min max min max
..  ..  ..  ..  ..  ..  ..  ..
..  ..  ..  ..  ..  ..  ..  ..
..  ..  ..  ..  ..  ..  ..  ..
..  ..  ..  ..  ..  ..  ..  ..
......

循環中的mincons包含約束矩陣的所有min列,maxcons包含約束矩陣的所有max列。

例如,對於第一個循環,期望的返回范圍是6.1到7.0,我在solve.QP函數中使用mincons [,1]和maxcons [,1]作為約束。 同樣的情況適用於接下來的三個循環。

但是R一直給我“下標超出范圍”錯誤。 我已經閱讀了一些關於stackoverflow的類似問題,但是我仍然無法弄清為什么遇到此錯誤。 誰能幫助我。 謝謝。

You can download dataconstraints.csv and datacorrelations.csv at 
https://www.dropbox.com/s/6bosunahysdfpcj/dataconstraints.csv
https://www.dropbox.com/s/vb94obm83lttdej/datacorrelations.csv

library(quadprog)

mydata = read.csv("dataconstraints.csv") 
er <- matrix(mydata[,1], nrow=23, ncol=1)
stdevs <- matrix(mydata[,2], nrow=23, ncol=1) 
min <- mydata[,c(FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE)]
mincons <- as.matrix(sapply(min, as.numeric))
max <- -mydata[,c(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)]
maxcons <- as.matrix(sapply(max, as.numeric))

mycorr = read.csv("datacorrelations.csv")
correlation <- mycorr
b <- stdevs %*% t(stdevs)  
covariance <- b * correlation

dvec <- er
Dmat <- as.matrix(sapply(covariance, as.numeric))

A.Equality <- matrix(c(1), nrow=length(er), ncol=1)
Amat <- cbind(A.Equality, er, diag(length(er)),-diag(length(er)))

port_ret1 = NULL
bvec1 = matrix(data=NA, nrow=5, ncol=48)
w1 = matrix(data=NA, nrow=5, ncol=23)
sd1 = matrix(data=NA, nrow=5, ncol=1)
ret1 = matrix(data=NA, nrow=5, ncol=1)

port_ret2 = NULL
bvec2 = matrix(data=NA, nrow=5, ncol=48)
w2 = matrix(data=NA, nrow=5, ncol=23)
sd2 = matrix(data=NA, nrow=5, ncol=1)
ret2 = matrix(data=NA, nrow=5, ncol=1)

port_ret3 = NULL
bvec3 = matrix(data=NA, nrow=5, ncol=48)
w3 = matrix(data=NA, nrow=5, ncol=23)
sd3 = matrix(data=NA, nrow=5, ncol=1)
ret3 = matrix(data=NA, nrow=5, ncol=1)

port_ret4 = NULL
bvec4 = matrix(data=NA, nrow=5, ncol=48)
w4 = matrix(data=NA, nrow=5, ncol=23)
sd4 = matrix(data=NA, nrow=5, ncol=1)
ret4 = matrix(data=NA, nrow=5, ncol=1)

n <- (8.0-6.1)/0.1+1

for(i in 1:n){

  if(i>=1 & i<=5){
    port_ret1[i]<-6.1+0.1*(i-1)
    bvec1[i,] <- c(1, port_ret1[i], mincons[,1], maxcons[,1])
    w1[i,] <- solve.QP(Dmat, dvec, Amat, bvec1[i,], meq=1)$solution
    sd1[i,] <- sqrt(w1[i,] %*% Dmat %*% w1[i,])
    ret1[i,] <- w1[i,] %*% er
  }

  if(i>=6 & i<=10){
    port_ret2[i]<-6.1+0.1*(i-1)
    bvec2[i,] <- c(1, port_ret2[i], mincons[,2], maxcons[,2])
    w2[i,] <- solve.QP(Dmat, dvec, Amat, bvec2[i,], meq=1)$solution
    sd2[i,] <- sqrt(w2[i,] %*% Dmat %*% w2[i,])
    ret2[i,] <- w2[i,] %*% er
  }

  if(i>=11 & i<=15){
    port_ret3[i]<-6.1+0.1*(i-1)
    bvec3[i,] <- c(1, port_ret3[i], mincons[,3], maxcons[,3])
    w3[i,] <- solve.QP(Dmat, dvec, Amat, bvec3[i,], meq=1)$solution
    sd3[i,] <- sqrt(w3[i,] %*% Dmat %*% w3[i,])
    ret3[i,] <- w3[i,] %*% er
  }

  if(i>=16 & i<=20){
    port_ret4[i]<-6.1+0.1*(i-1)
    bvec4[i,] <- c(1, port_ret4[i], mincons[,4], maxcons[,4])
    w4[i,] <- solve.QP(Dmat, dvec, Amat, bvec4[i,], meq=1)$solution
    sd4[i,] <- sqrt(w4[i,] %*% Dmat %*% w4[i,])
    ret4[i,] <- w4[i,] %*% er
  }
}


Error in `[<-`(`*tmp*`, i, , value = c(1, 6.6, 0, 0, 0, 0, 0, 0, 0, 0,  : 
  subscript out of bounds

錯誤看起來像這樣,所以我想第二個if語句超出范圍。 如果我只運行第一個if語句,則它運行正常,沒有錯誤。 我只是看不到任何超出范圍的問題。

好的,您的代碼很長,因此我沒有閱讀並嘗試理解其背后的概念,但是我對您的for循環的內容進行了一些調整,並且其執行沒有錯誤。 問題是每個子組port_ret1port_ret4bvec1bvec4等等……都具有5的索引長度,並且您試圖使用i = 1:20 (因為n=20 )來索引其中的值。 這對於第一個組來說很好port_ret1, bvec1, ... ,但是當i=6 ,您將無法執行port_ret2[i] <- some value ,因為port_ret2[6]不存在; 下標超出范圍 因此,我基本上只是將每個后續組中的i移回適當的數量(僅在用作索引的位置,例如,不使用<-6.1+0.1*(i-1) ):

for(i in 1:n){
  ##
  if( i <= 5){

    port_ret1[i]<-6.1+0.1*(i-1)
    bvec1[i,] <- c(1, port_ret1[i], mincons[,1], maxcons[,1])
    w1[i,] <- solve.QP(Dmat, dvec, Amat, bvec1[i,], meq=1)$solution
    sd1[i,] <- sqrt(w1[i,] %*% Dmat %*% w1[i,])
    ret1[i,] <- w1[i,] %*% er
  } else if( i <= 10 ){

    port_ret2[i-5]<-6.1+0.1*(i-1)
    bvec2[i-5,] <- c(1, port_ret2[i-5], mincons[,2], maxcons[,2])
    w2[i-5,] <- solve.QP(Dmat, dvec, Amat, bvec2[i-5,], meq=1)$solution
    sd2[i-5,] <- sqrt(w2[i-5,] %*% Dmat %*% w2[i-5,])
    ret2[i-5,] <- w2[i-5,] %*% er
  } else if( i <= 15 ){

    port_ret3[i-10]<-6.1+0.1*(i-1)
    bvec3[i-10,] <- c(1, port_ret3[i-10], mincons[,3], maxcons[,3])
    w3[i-10,] <- solve.QP(Dmat, dvec, Amat, bvec3[i-10,], meq=1)$solution
    sd3[i-10,] <- sqrt(w3[i-10,] %*% Dmat %*% w3[i-10,])
    ret3[i-10,] <- w3[i-10,] %*% er
  } else {

    port_ret4[i-15]<-6.1+0.1*(i-1)
    bvec4[i-15,] <- c(1, port_ret4[i-15], mincons[,4], maxcons[,4])
    w4[i-15,] <- solve.QP(Dmat, dvec, Amat, bvec4[i-15,], meq=1)$solution
    sd4[i-15,] <- sqrt(w4[i-15,] %*% Dmat %*% w4[i-15,])
    ret4[i-15,] <- w4[i-15,] %*% er
  }
  ##
}

另外,您應該使用if...else if...else語句,而不是將具有冗余條件檢查的if語句獨立鏈接在一起。 例如,在第二條語句中,您不必檢查if(i >= 6 & i <= 10)因為只有當 i >= 6 (因為您的第一個if(i <= 5)條件)。 無論如何,這的確執行沒有錯誤,但是就像我說的那樣,我沒有花時間從概念上了解它正在完成的任務,所以如果還有其他需要調整的地方,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM