R语言出现nonconformable arrays报错:最优权重计算代码如何修复?
R语言最优权重计算报错修复:non-conformable arrays
我编写了如下用于计算最优权重的R语言代码:
return_vector_2 <- rbind(0.08,0.06) covmatrix_2 <-matrix(c(0.3,0.1,0.1,0.2),nrow=2) target_return <- 0.1 onevector2 <- rbind(1,1) onevector2_t <- cbind(1,1) a2beregnet <- onevector2_t %*% solve(covmatrix_2) %*% onevector2 b2beregnet <- onevector2_t %*% solve(covmatrix_2) %*% Return_vector2 c2beregnet <- t(Return_vector2) %*% solve(covmatrix_2) %*% Return_vector2 d2beregnet <- a2beregnet * c2beregnet - b2beregnet^2 optimal_weights_2 <- ((a2beregnet*target_return-b2beregnet)/(d2beregnet)) * solve(covmatrix_2) %*% return_vector_2 +((c2beregnet-target_return*b2beregnet)/(d2beregnet)) %*% solve(covmatrix_2) %*% onevector2
运行到optimal_weights_2行时弹出报错:
Error in ((a2beregnet * target_return - b2beregnet)/d2beregnet) * solve(covmatrix_2) %*% :
non-conformable arrays
按技术逻辑,标量与矩阵相乘不应存在问题,请问该如何修复此报错?
修复方案
- 统一变量名大小写:代码中定义的是小写开头的
return_vector_2,但计算b2beregnet和c2beregnet时误用了大写开头的Return_vector2,这会导致变量取值错误,需修正为一致的变量名。 - 修正矩阵乘法运算符:第二个项中的标量
((c2beregnet-target_return*b2beregnet)/(d2beregnet))与矩阵solve(covmatrix_2)相乘时,应使用元素-wise乘法*而非矩阵乘法%*%。%*%要求两侧数组维度严格匹配,标量与矩阵的合法乘法需用*。 - 调整代码换行格式:将
+号放在上一行末尾或当前行开头(保持缩进),确保R将其识别为同一表达式的延续,避免解析为独立语句。
修复后的完整代码
return_vector_2 <- rbind(0.08,0.06) covmatrix_2 <- matrix(c(0.3,0.1,0.1,0.2), nrow=2) target_return <- 0.1 onevector2 <- rbind(1,1) onevector2_t <- t(onevector2) # 用转置函数替代手动cbind,更规范 a2beregnet <- onevector2_t %*% solve(covmatrix_2) %*% onevector2 b2beregnet <- onevector2_t %*% solve(covmatrix_2) %*% return_vector_2 # 修正变量名 c2beregnet <- t(return_vector_2) %*% solve(covmatrix_2) %*% return_vector_2 # 修正变量名 d2beregnet <- a2beregnet * c2beregnet - b2beregnet^2 # 修复运算符和换行问题 optimal_weights_2 <- ((a2beregnet*target_return - b2beregnet)/d2beregnet) * solve(covmatrix_2) %*% return_vector_2 + ((c2beregnet - target_return*b2beregnet)/d2beregnet) * solve(covmatrix_2) %*% onevector2
内容的提问来源于stack exchange,提问作者Markus Larsen
相关产品推荐
相关产品推荐

