r-在模拟测量误差时使用ifelse



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

最新更新