В настоящее время я разрабатываю симуляцию Монте-Карло с блестящими R. К сожалению, я застрял в некоторых и не вижу ошибки прямо сейчас. Я тестировал код для моделирования раньше, и он работает. Теперь я пытаюсь превратить его в приложение Shiny.R Shiny Matrix Multiplication
Это часть моего кода server.r. Это только часть полного кода, но я думаю, что сужу ошибку до этой части. Когда я запустить приложение и нажать кнопку действия, которые вызывают функцию dataScenario()
, я получаю следующее сообщение об ошибке:
Error in beta %*% t(dataScenario()[[1]]) : verlangt numerische/komplexe Matrix/Vektor-Argumente
Извините за немца, не полный уверен в правильном переводе, но в основном R жалуется, что умножение матриц не может быть выполнено, поскольку один из элементов не является вектором/матрицей.
output$plot <- renderPlot({
z <- rep(seq(10, 1000, 10), 4)
x <- c(rep(1, 100), rep(2, 100), rep(3, 100), rep(4, 100))
t.container <- data.frame(time = rep(NA, length(z)),
up = rep(NA, length(z)),
low = rep(NA, length(z)),
geo = z,
strength = x
)
# Censoring
v <- runif(n = nsim, min = 0, max = 1)
X <- as.matrix(dataScenario()[[1]])
Z <- as.matrix(dataScenario()[[2]])
for(i in 1:length(z)){
mu.beta.rebel <- gamma.0 + gamma.geography * z[i] + gamma.geography.q * z[i]^2 + gamma %*% t(Z)
mu <- mean(beta.0) + mu.beta.rebel * x[i] + beta %*% t(X)
t <- (- log(v)/(exp(mu)))^(1/alpha)
t <- apply(t, 1, mean)
t.container[i, 1] <- mean(t)
t.container[i, 2] <- stats::quantile(t, probs = c(0.025))
t.container[i, 3] <- stats::quantile(t, probs = c(0.975))
}
})
dataScenario()
выглядит следующим образом
dataScenario <- eventReactive(input$simButton, {
# Recode support
rebel.support <- 0
gov.support <- 0
if(length(input$support) == 2){
rebel.support <- 1
gov.support <- 1
}
if(length(input$support) == 1){
rebel.support <- ifelse(input$support == 1, 1, 0)
gov.support <- ifelse(input$support == 2, 1, 0)
}
# Recode
peace <- ifelse(input$peace == TRUE, 1, 0)
# Define covariates on macro level (X)
X <- cbind(rep(input$polity, nsim),
rep((input$gdp - 3556), nsim),
rep(((input$pop * 1e06) - 1.174e+08), nsim),
rep(input$ethnic, nsim),
rep(input$type, nsim), # Conflict Type (no coup d'eta)
rep(rebel.support, nsim), # Rebel Support (no rebel support)
rep(gov.support, nsim), # Government Support (no government support)
rep(peace, nsim), # Termination Type (no peace settlement)
rep(input$n.rebels, nsim) # N rebels (1 rebel group)
)
# Define covariates on micro level (Z)
Z <- cbind(rep(rebel.support, nsim), # Rebel Support (no rebel support)
rep(input$n.diamonds, nsim),
rep(input$oil, nsim)
)
scenario.list <- list(X, Z)
return(scenario.list)
})
Для того, чтобы проверить класс и размеры элементов должны быть умножены, я также добавил следующее:
output$test1 <- renderText({
paste("X is of class: ", class(dataScenario()[[1]]), "with ", dim(dataScenario()[[1]])[1], dim(dataScenario()[[1]])[2])
})
output$test2 <- renderText({
paste("beta is of class: ", class(beta), "with ", dim(beta)[1], dim(beta)[2])
})
И выводится при запуске приложения:
X is of class: matrix with 100 9 beta is of class: matrix with 1500 9
Я знаю, что он избыточен, чтобы сохранить два сценария в X и Y как матрицу, поскольку обе они уже являются матрицами. Также попробовал это, используя напрямую dataScenario()[[1]]
, который дает ту же ошибку, что и выше.
Полезные комментарии очень приветствуются. Спасибо!
бета загружается в начале приложения, жаль, что я на самом деле не сделал знаете, что переполнение стека является правильным местом, есть ли способ переместить его там? – winwin
Да, я поставлю этот вопрос как «вне темы» и попрошу его переместить. Вы можете делать то же самое. – shadowtalker
Может ли ваш код модифицировать 'beta' где-то еще? Можете ли вы попробовать распечатать размеры 'beta' снова (используя' print') прямо перед вычислением 'beta% *% t (X)', чтобы увидеть, все ли у него правильные тусклые изображения? На боковой ноте вы можете вытащить 'beta% *% t (X)' из цикла for, поскольку он не зависит от 'i' (более эффективный, чем пересчет его каждый раз). – adilapapaya