【问题标题】:why map function is not working in monte carlo为什么地图功能在蒙特卡洛不起作用
【发布时间】:2021-03-17 20:25:57
【问题描述】:

我想做1000次蒙特卡罗模拟线性回归,得到1000个估计:

dt <- data.table( x = runif(n,0,1),
                  e = rnorm(n),
                  alpha = runif(n,-100,100))[, y := alpha + beta*x + e][, -c("e","alpha")]
set.seed(872)

map( rep(1:B) , ~lm(y ~ x, data = dt))

这很好用。但是我把上面的第三行改成了


dt %>% map( rep(1:B), ~lm(y ~ x, data=. ) )

发生错误。为什么会出现错误?

【问题讨论】:

  • 在您的第一个代码块中,dt 是一个数据表,其中包含行中的列。当您在第二个代码中使用 . 时,它表示 1 和 B 之间的整数,您的问题中没有定义。

标签: r dplyr tidyverse purrr


【解决方案1】:

当您使用管道时,左侧 (LHS) 的输入是右侧 (RHS) 函数的第一个参数。

所以,代码

dt %>% map(rep(1:B), ~lm(y ~ x, data=. ))

等同于:

map(dt, rep(1:B), ~lm(y ~ x, data=. ) )

要在此处使用管道,您可以将代码包装在 {...} 中,但是,. 不是数据帧,而是来自 map 的当前值。参见例如,

map(1:5, ~.)

#[[1]]
#[1] 1

#[[2]]
#[1] 2

#[[3]]
#[1] 3

#[[4]]
#[1] 4

#[[5]]
#[1] 5

您可以在map 中使用匿名函数,因此p 是来自map 的值,. 可以称为数据帧。

dt %>% {map(rep(1:B), function(p) lm(y ~ x, data=. ) )}

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2017-08-12
    • 2018-05-03
    • 2018-02-10
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多