1

我想使用 R 生成两个分类变量(例如眼睛颜色和头发颜色),我可以在其中指定这两个变量的关联程度。对我来说,眼睛颜色的级别与头发颜色的级别相关并不重要,但能够指定整体关联,例如通过指定优势比,是一项要求。另外,我知道有一些方法可以使用例如包来对两个正态分布的连续变量执行此操作mvtnorm,因此我可以采取该路线,然后选择切点以使变量在事后成为分类变量,但我不想要如果我能避免的话,就这样做。任何帮助将不胜感激!

编辑:很抱歉从一开始就没有更清楚,但我真正想问的是,在某个 R 包中是否有任何人都知道的函数可以在一两行中执行此操作。

4

1 回答 1

3

如果您可以指定优势比(并且您还需要指定基线优势),您只需将它们转换为概率并使用runif().

编辑(我误解了这个问题):看看bindata 包


如果你喜欢,这里是我写的一个函数,你可以在没有包的情况下使用它来生成这样的数据。它相当笨重;它的目的是不言自明,而不是优雅或快速。

odds.to.probs <- function(odds){
  probs <- odds / (odds+1)
  return(probs)
}

get.correlated.binary.data <- function(N, odds.x.eq.0, odds.y.eq.0.x.eq.0, 
                                       odds.ratio){
  odds.y.eq.0.x.eq.1 <- odds.y.eq.0.x.eq.0*odds.ratio
  prob.x.eq.0        <- odds.to.probs(odds.x.eq.0)
  prob.y.eq.0.x.eq.0 <- odds.to.probs(odds.y.eq.0.x.eq.0)
  prob.y.eq.0.x.eq.1 <- odds.to.probs(odds.y.eq.0.x.eq.1)

  x <- ifelse(runif(N)<=prob.x.eq.0, 0, 1)
  y <- rep(NA, N)
  y <- ifelse(x==0, ifelse(runif(sum(x))<=prob.y.eq.0.x.eq.0,       0, 1), y)
  y <- ifelse(x==1, ifelse(runif( (N-sum(x)) )<=prob.y.eq.0.x.eq.1, 0, 1), y)

  dat <- data.frame(x=x, y=y)
  return(dat)
}

> set.seed(9)
> dat <- get.correlated.binary.data(30, 3, 1.5, -.03)
> table(dat)
   y
x    0  1
  0 10 13
  1  0  7
于 2013-12-02T14:40:18.750 回答