首页 文章

R:矢量化ifelse如何在多值yes / no参数的上下文中工作?

提问于
浏览
1

格尔曼和希尔在R中解释模拟 . 在第139页,他们说:

美国52%的成年人是女性,48%是男性 . 人的高度大致正常分布,平均69.1英寸,标准差2.9英寸;女性,平均63.7,标准差2.7 . 假设我们随机选择了10个成年人 . 我们对他们的平均身高有什么看法?

sex <- rbinom (10, 1, .52) R code
height <- ifelse (sex==0, rnorm (***10***, 69.1, 2.9), rnorm (***10***, 64.5, 2.7))     #"***"s added for emphasis.
avg.height <- mean (height)
print (avg.height)

我不明白两个10在rnorm函数中做了什么 .

性是一个10矢量 . 如果性别[1]为0,则ifelse从正态分布中选择10个高度值,平均值为69.1 ...,如果性别[2]为1,则ifelse从正常值选择10个高度值,平均值为64.5,依此类推,且仅为值性[10]将确定最终分配到高度的东西 .

显然我的理解是不正确的,它是从正确的分布中挑选十个值 . 我将第一次正态分布的均值改为669.1以理解它是如何将值赋值给高度的,而上面的代码正在做它应该做的事情 . 我仍然不明白两个10是什么东西在rnorm函数 . 当我将两个10改为两个时,一切都按预期工作 . 有人可以向我解释在上面的代码中如何分配10个高度值 .

1 回答

  • 2

    实际上,在定义正确的观测数量时存在差异 . 那是因为显然 ifelse 函数首先"completes"两个选项的数据,如data.frame,然后对每一行应用if选择 . 由于 sex 是10个元素向量,因此在 rnorm 函数中需要10个才能得到正确的答案 . 您可以看到用10s代替10s,将一个或十个元素向量传递给 ifelse 并为每个随机代重置 seed . 见下文:

    > set.seed(12345)
    > sex <- rbinom (10, 1, .52) 
    > 
    > set.seed(12345)
    > ifelse (sex[1]==0, rnorm (1, 69.1, 2.9), rnorm (1, 64.5, 2.7)) #correct
    [1] 70.79803
    > set.seed(12345)
    > ifelse (sex[1]==0, rnorm (10, 69.1, 2.9), rnorm (10, 64.5, 2.7)) #almost true
    [1] 70.79803
    > set.seed(12345)
    > ifelse (sex==0, rnorm (1, 69.1, 2.9), rnorm (1, 64.5, 2.7)) #wrong
     [1] 70.79803 70.79803 70.79803 70.79803 66.41556 66.41556 66.41556 66.41556 70.79803
    [10] 70.79803
    > set.seed(12345)
    > ifelse (sex==0, rnorm (10, 69.1, 2.9), rnorm (10, 64.5, 2.7)) #correct
     [1] 70.79803 71.15745 68.78302 67.78486 62.47356 66.70563 62.10683 63.60474 68.27594
    [10] 66.43397
    > # is this what ifelse is doing?
    > set.seed(12345)
    > da=data.frame(sex, M=rnorm (10, 69.1, 2.9), W=rnorm (10, 64.5, 2.7))
    > da$res <- apply(da,1,function(sx)ifelse(sx[1]==0,sx[2],sx[3]))
    > da$res
     [1] 70.79803 71.15745 68.78302 67.78486 62.47356 66.70563 62.10683 63.60474 68.27594
    [10] 66.43397
    

相关问题