Пакет CVXR, Нечисловой аргумент математической функции
Я хотел бы минимизировать следующую функцию (с ограничением трехкомпонентной смеси) по beta
:
sum((y - X %*% beta)^2)/(2*m) + sum(log(sum(pi_ratio * Normal(beta, mu, sigma))))
используя пакет CVXR в R.
Есть три pi_ratios, mu's and sigma's
Вот.
Данные генерируются как в коде. Я предполагаю pi_ratios, mu's
известны. Цикл окончен sigma's
, Когда я запускаю код, он дает
Non-numeric argument to mathematical function
Если я использую as.matrix(beta)
вместо beta
в dnorm
ошибка становится
Error in as.vector(data) : no method for coercing this S4 class to a vector
Любое предложение, пожалуйста?
Вот код:
library(CVXR)
# Constraint
const <- function(beta, pio, mu, sigma2) {
bil1 = pio[1]*dnorm(beta,mu[1],sqrt(sigma2[1]))
bil2 = pio[2]*dnorm(beta,mu[2],sqrt(sigma2[2]))
bil3 = pio[3]*dnorm(beta,mu[3],sqrt(sigma2[3]))
sum(log(bil1+bil2+bil3))
}
######################################################
# Problem data
set.seed(1)
n <- 20
m <- 1000
density <- 0.25 # Fraction of non-zero beta
beta_true <- matrix(rnorm(n), ncol = 1)
idxs <- sample.int(n, size = floor((1 - density) * n), replace = FALSE)
beta_true[idxs] <- 0
sigma <- 45
X <- matrix(rnorm(m * n, sd = 5), nrow = m, ncol = n)
eps <- matrix(rnorm(m, sd = sigma), ncol = 1)
y <- X %*% beta_true + eps
#######################################################
# Problem
trials <- 10
beta_vals <- matrix(0, nrow = n, ncol = trials)
sigma2p_vals <- exp(seq(3,5, length.out = trials))
beta <- Variable(n)
loss <- sum((y - X %*% beta)^2)/(2*m)
#######################################################
## Solution
pio=c(.05,.9,.05)
mu=c(-2.5,0,2.5)
for(i in 1:trials) {
sigmap <- sigma2p_vals[i]
sigma2 <- c(sigmap,sigmap*(1e-4),sigmap)
obj <- loss + const(beta, pio, mu, sigma2)
prob <- Problem(Minimize(obj))
result <- solve(prob)
beta_vals[,i] <- result$getValue(beta)
}
d <- data.frame(sigma2p_vals, t(beta_vals))