在模拟测量误差时使用 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))
我正在解决一个问题,我想要一个二进制变量 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))