基于匹配和概率的条件模拟

时间:2017-03-06 20:23:37

标签: r

两个矩阵

df_A = matrix(, nrow = 5, ncol = 3)
df_A[,1] = c(0, 0, 1, -1, 1)
df_A[,2] = c(0, 1, -1, 0, -1)
df_A[,3] = c(1, 0, -1, 1, 1)
df_B = matrix(, nrow = 5, ncol = 3)
df_B[,1] = c(1, -1, 0, 0, 1)

我想根据几个条件模拟df_B的第2列和第3列。如果df_A的值为零,则df_B的值不会更改。例如,df_B的前两个值不应在第一次迭代时更改,因为df_A的前两个值为零。如果df_A的值是1或负1,那么df_B的相应值将在给定一定概率的情况下取该值(在该示例中为20%)。例如,如果df_A为负1且df_B为零(或1),则df_B的相应值将在20%的时间内变为负值。

我知道以下内容不正确,但这是我到目前为止所做的:

belief_change = function(x){
  if (df_A[x] = -1 & df_B[x] != -1 & sample(1:2, 1, prob = c(0.2, 0.8) = 1))
    df_B[x+1] = df_A[x]
  else
    df_B[x+1] = df_B[x]
  if (df_A[x] = 1 & df_B[x] != 1 & sample(1:2, 1, prob = c(0.2, 0.8) = 1))
    df_B[x+1] = df_A[x]
  else
    df_B[x+1] = df_B[x]
  if (df_A[x] = 0)
    df_B[x+1] = df_B[x]
}

我在这里使用示例函数来帮助生成概率。我还需要最终将它放入for循环中。

1 个答案:

答案 0 :(得分:0)

您的代码中存在多个错误。首先,正确的逻辑相等运算符是==而不是=。其次,您将= 1置于sample的调用中。第三,如果你真的想影响调用函数的外部环境(即通过调用函数来改变df_B,你需要使用深度赋值运算符<<-,而不是=<-。您可以阅读有关此here的更多信息。

以下是适用的代码版本;看看它是否符合你的要求。

belief_change <- function(x) {
  if (df_A[x] == -1 & df_B[x] != -1 & sample(1:2, 1, prob = c(0.2, 0.8)) == 1)
    df_B[x+1] <<- df_A[x]
  else
    df_B[x+1] <<- df_B[x]

  if (df_A[x] == 1 & df_B[x] != 1 & sample(1:2, 1, prob = c(0.2, 0.8)) == 1)
    df_B[x+1] <<- df_A[x]
  else
    df_B[x+1] <<- df_B[x]

  if (df_A[x] == 0)
    df_B[x+1] <<- df_B[x]
}