Пакет 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))

0 ответов

Другие вопросы по тегам