我正在处理一个问题,我希望有一个二进制变量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))