使用 purrr::map2 具有所有变量排列的模型

Posted

技术标签:

【中文标题】使用 purrr::map2 具有所有变量排列的模型【英文标题】:Models with all variable permutations using purrr::map2 【发布时间】:2022-01-07 16:09:45 【问题描述】:

以下代码为我提供了模型 a <- cb <- d,但我想知道如何修改它以使其也具有 a <- db <- c

outcomes <- df %>%
   select(a, b)
predictors <- df %>%
   select(c, d)
model <- function(outcomes, predictors) lm(outcomes ~ predictors)
map2(outcomes, predictors, model)``` 

【问题讨论】:

您不需要for-loop 甚至map。只需重塑您的数据并为整个数据集做一个 lm 【参考方案1】:

我想出了这个:

map(packs, library, character.only = TRUE) 

df <- tibble(a = 1:100, b = a^3, c = b/33, d = a/3) 
outcomes <- df %>%
   select(a, b)
predictors <- df %>%
   select(c, d)
map(outcomes, function(x) map(predictors, function(y) lm(x ~ y)))```

【讨论】:

【参考方案2】:

为此,您不需要 for 循环甚至映射。只需重塑您的数据并为整个数据集做一个 lm。检查以下示例:

data <- head(iris[-5], 6)
 
indep <- c('Sepal.Length',  'Petal.Length')
dep <- c('Sepal.Width',  'Petal.Width')

现在运行所有模型:

data %>%
  pivot_longer(all_of(indep))%>%
  lm(as.matrix(.[dep])~0 + name/value, .)

Call:
lm(formula = as.matrix(.[dep]) ~ 0 + name/value, data = .)

Coefficients:
                        Sepal.Width  Petal.Width
namePetal.Length         1.1702      -0.5298    
nameSepal.Length        -1.6859      -0.8402    
namePetal.Length:value   1.5263       0.5263    
nameSepal.Length:value   1.0241       0.2169   

结果如下:

前两行是截距,后两行是 B1 系数。比较:

lm(Sepal.Width~Petal.Length, data)

Call:
lm(formula = Sepal.Width ~ Petal.Length, data = data)

Coefficients:
 (Intercept)  Petal.Length  
       1.170         1.526  

lm(Sepal.Width~Sepal.Length, data)

Call:
lm(formula = Sepal.Width ~ Sepal.Length, data = data)

Coefficients:
 (Intercept)  Sepal.Length  
      -1.686         1.024  

现在你可以和Petal.Width比较

【讨论】:

【参考方案3】:

假设哪些变量将是自变量或因变量是固定的。在这种情况下,ab 将是因变量,cd 将是自变量。

你可以试试

df <- data.frame(
  a = 1:4,
  b = 2:5,
  c = rnorm(4),
  d = runif(4)
)
dep <- c("a", "b")
indep <- c("c", "d")

indep <- gtools::permutations(n = 2, r = 2, v = indep)

df %>%
  select(dep)

df %>%
  select(indep[1,])

modlist <- list()
for (i in 1:nrow(indep))
  outcomes <- df %>%
    select(dep)
  predictors_ <- df %>%
    select(indep[i,])
  fit <- function(outcomes, predictors_) lm(outcomes ~ predictors_)
  modlist[[i]] <- map2(outcomes, predictors_, fit) 

modlist

[[1]]
[[1]]$a

Call:
lm(formula = outcomes ~ predictors_)

Coefficients:
(Intercept)  predictors_  
     2.4296      -0.2222  


[[1]]$b

Call:
lm(formula = outcomes ~ predictors_)

Coefficients:
(Intercept)  predictors_  
      2.058        2.631  



[[2]]
[[2]]$a

Call:
lm(formula = outcomes ~ predictors_)

Coefficients:
(Intercept)  predictors_  
      1.058        2.631  


[[2]]$b

Call:
lm(formula = outcomes ~ predictors_)

Coefficients:
(Intercept)  predictors_  
     3.4296      -0.2222  

【讨论】:

以上是关于使用 purrr::map2 具有所有变量排列的模型的主要内容,如果未能解决你的问题,请参考以下文章

更安静的purrr :: map2用于名称乱序的列表

在具有包含数据帧的列表列的小标题中,如何使用自定义函数包装 mutate(foo = map2(...))?

通配符

Relay报错fragment变量,但是没有一个fragment有变量

使用啥数据结构来快速存储文本文件,它有变量号。行数和变量号。在 C++ 中快速添加子元素?

在 GitLab CI 中,合并请求的目标分支是不是有变量?