R闪亮矩阵乘法

时间:2015-05-19 21:16:22

标签: r matrix

我目前正在开发一种具有R光泽的蒙特卡罗模拟。 不幸的是,我陷入困境,现在无法看到错误。我之前测试了模拟的代码并且它可以工作。我现在正在尝试的是将它变成一个闪亮的应用程序。

这是我的server.r代码的一部分。它只是完整代码的一部分,但我认为我将错误缩小到这一部分。当我运行应用程序并点击触发dataScenario()功能的操作按钮时,出现以下错误:

  

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])
  })

运行App时输出:

  

X是类:矩阵100 9   beta属于类:矩阵,1500 9

我知道将X和Y中的两个场景保存为矩阵是多余的,因为两者都已经是矩阵。也直接使用dataScenario()[[1]]尝试使用它,它会产生与上面相同的错误。

非常欢迎有用的评论。 谢谢!

1 个答案:

答案 0 :(得分:0)

发现错误。 Shiny至少返回来自input的元素作为角色。因此,维度是正确的,但矩阵内的整个数据是char ...通过添加以下行解决它:

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