2015-05-19 5 views
0

В настоящее время я разрабатываю симуляцию Монте-Карло с блестящими 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]], который дает ту же ошибку, что и выше.

Полезные комментарии очень приветствуются. Спасибо!

+0

бета загружается в начале приложения, жаль, что я на самом деле не сделал знаете, что переполнение стека является правильным местом, есть ли способ переместить его там? – winwin

+0

Да, я поставлю этот вопрос как «вне темы» и попрошу его переместить. Вы можете делать то же самое. – shadowtalker

+0

Может ли ваш код модифицировать 'beta' где-то еще? Можете ли вы попробовать распечатать размеры 'beta' снова (используя' print') прямо перед вычислением 'beta% *% t (X)', чтобы увидеть, все ли у него правильные тусклые изображения? На боковой ноте вы можете вытащить 'beta% *% t (X)' из цикла for, поскольку он не зависит от 'i' (более эффективный, чем пересчет его каждый раз). – adilapapaya

ответ

0

Обнаружили ошибку. Блестящий вернул хотя бы элемент от input в качестве персонажа. Следовательно, размеры были правильными, но все данные внутри матрицы было char ... Решено, добавив следующую строку:

X <- matrix(data = unlist(lapply(X, as.numeric)), nrow = nsim, ncol = 9)

Смежные вопросы