Использование ifelse при симуляции ошибки измерения - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю над проблемой, где я хотел бы иметь двоичную переменную 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 здесь будет выполнять ошибочную классификацию A> Z только для случаев, когда Y был равен нулю, но просмотр «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.

Есть идеи как это исправить?

1 Ответ

0 голосов
/ 28 ноября 2018

Проблема заключается в присвоении внутри ifelse() Функция ifelse() является векторизованной версией if, и она оценивает свои параметры одновременно.Вы не можете сделать условное присвоение внутри параметров.Более распространенная практика - присваивать результат векторизованной операции новой переменной.Было бы лучше написать как

z <- ifelse(y==1, a, (a==1)*(runif(n)<.80))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...