在模拟测量误差时使用 ifelse

Using ifelse while simulating measurement error

我正在解决一个问题,我想要一个二进制变量 Z,它是 A 的错误分类或测量不当的代理,仅适用于 Y 的某个级别。

我这里模拟A和Y:

set.seed(76)
n=10000
#generate correctly classified treatment A
a <- (rbinom(n, 1, 0.5))    
#generate Y conditional on A
pry <- exp(-3 + 0.7*a )/(1+ exp(-1 + 0.7*a))
y <- 1*(runif(n)<=pry)

然后生成 Z,它是 A 的错误分类版本(在下面的示例中,Z 捕获了 80% 的真阳性)

#misclassify treatment A into Z
#such that treatment is only misclassified if Y=0
ifelse(y==1, z<-a,z<-(a==1)*(runif(n)<.80))
check<-xtabs(~a+z+y)
check

我认为在这里使用 ifelse 只会对 Y 为零的情况执行 A>Z 错误分类,但查看 "check" 会显示以下输出:

, , y = 0

   z
a      0    1
  0 4799    0
  1  903 3821

, , y = 1

   z
a      0    1
  0  174    0
  1   54  249

表明 Z 对于 Y=1 和 Y=0 都被错误分类了。

关于如何解决这个问题有什么想法吗?

问题是 ifelse() 内部的赋值 ifelse() 函数是 if 的矢量化版本,它会一次性计算所有参数。您不能在参数内部进行条件赋值。更常见的做法是将向量化运算的结果分配给新变量。最好写成

z <- ifelse(y==1, a, (a==1)*(runif(n)<.80))