【问题标题】:Fit loess smoothers for multiple groups across multiple numeric variables跨多个数值变量为多个组拟合黄土平滑器
【发布时间】:2020-03-04 00:40:32
【问题描述】:

我需要通过分组变量(Animal)跨多个数值列(Var1,Var2)拟合许多黄土样条,并提取这些值。

我找到了执行此任务的代码一次一个变量;

# Create dataframe 1
OneVarDF <- data.frame(Day = c(replicate(1,sample(1:50,200,rep=TRUE))),
                 Animal = c(c(replicate(100,"Greyhound"), c(replicate(100,"Horse")))),
                 Var1 = c(c(replicate(1,sample(2:10,100,rep=TRUE))), c(replicate(1,sample(15:20,100,rep=TRUE)))))


library(dplyr)
library(tidyr)
library(purrr)

# Get fitted values from each model
Models <- OneVarDF %>%
  tidyr::nest(-Animal) %>%
  dplyr::mutate(m = purrr::map(data, loess, formula = Var1 ~ Day, span = 0.30),
                fitted = purrr::map(m, `[[`, "fitted")
  )

# Create prediction column
Results <- Models %>%
  dplyr::select(-m) %>%
  tidyr::unnest()

这个“结果”数据框对于下游任务至关重要(消除许多非参数分布的趋势)。

我们如何使用具有多个数字列的数据框(下面的代码)来实现这一点,并提取 “结果” 数据框?谢谢。

# Create dataframe 2
TwoVarDF <- data.frame(Day = c(replicate(1,sample(1:50,200,rep=TRUE))),
                       Animal = c(c(replicate(100,"Greyhound"), c(replicate(100,"Horse")))),
                       Var1 = c(c(replicate(1,sample(2:10,100,rep=TRUE))), c(replicate(1,sample(15:20,100,rep=TRUE)))),
                       Var2 = c(c(replicate(1,sample(22:27,100,rep=TRUE))), c(replicate(1,sample(29:35,100,rep=TRUE)))))

【问题讨论】:

    标签: r grouping multiple-columns smoothing loess


    【解决方案1】:

    我们可以使用长格式获取数据。 pivot_longergroup_byAnimal 和列名并将loess 应用于每个组合。

    library(dplyr)
    library(tidyr)
    
    TwoVarDF %>%
      pivot_longer(cols = starts_with('Var')) %>%
      group_by(Animal, name) %>%
      mutate(model = loess(value~Day, span = 0.3)$fitted)
    

    【讨论】:

    • 此方法生成 1 个拟合值列而不是 2 个。
    • @Brad 查看更新的答案。这会以长格式返回数据。
    • 这太棒了,但我失去了“Day”。目标是保留“Day”,因为我们需要从观察中减去预测以消除趋势。
    • 是的,我更新了答案以使用mutate 而不是summarise,这将有助于保留Day
    • 这可能是一个愚蠢的问题,但是如何实现predict 函数来预测例如GreyhoundDay == 6Var1 的值Horse因为Day == 6上没有数据点?
    【解决方案2】:

    包含一个gather() 函数以与您之前的代码类似。

    Models2 <- TwoVarDF %>%
      gather(varName, varVal, 3:4) %>% 
      tidyr::nest(-Animal, -varName) %>%
      dplyr::mutate(m = purrr::map(data, loess, formula = varVal ~ Day, span = 0.30),
                    fitted = purrr::map(m, `[[`, "fitted")
      )
    

    【讨论】:

      猜你喜欢
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 2019-02-05
      相关资源
      最近更新 更多