1

我有一个包含 100 列数值的数据框,其中每一列是第一列的不同循环移位。我需要在这些列上一一放置一个 LOESS 过滤器。在我的上下文中,协变量很简单,只是 index 1, 2, 3, ..., <number of rows>

如何在新数据框中获得平滑值?谢谢!

4

1 回答 1

4

假设您的数据框被调用dat,您可以执行以下操作:

## response
vars <- colnames(dat)
## covariate
id <- 1:nrow(dat)
## define a loess filter function (fitting loess regression line)
loess.filter <- function (x, span) loess(formula = paste(x, "id", sep = "~"),
                                         data = dat,
                                         degree = 1,
                                         span = span)$fitted 
## apply filter column-by-column
new.dat <- as.data.frame(lapply(vars, loess.filter, span = 0.75),
                         col.names = colnames(dat))

该函数loess.filter基于 R 内置函数loess。看看?loess你是否从未使用过它。在这里,我们使用了以下函数参数:

  • formula:我们即时生成公式;
  • span:这控制平滑参数。

我们使用逐列lapply应用,仅保留拟合/平滑值。loess如果您以前从未使用lapply过,请继续阅读?lapply

我们可以定制span。你可以比较:

as.data.frame(lapply(vars, loess.filter, span = 1),
              col.names = colnames(dat))
as.data.frame(lapply(vars, loess.filter, span = 0.75),
              col.names = colnames(dat))
as.data.frame(lapply(vars, loess.filter, span = 0.5),
              col.names = colnames(dat))

随着我们选择逐渐变小span,结果越来越接近原始数据。但可以肯定的是,它也变得越来越参差不齐。


这是一个小例子,使用span = 0.75.

## example data
set.seed(0); dat <- as.data.frame(replicate(3, rnorm(10)))
colnames(dat) <- paste0("var", 1:ncol(dat))

原始数据:

> dat
          var1        var2        var3
1   1.68382474 -1.74121307  2.71648728
2  -0.68325574  1.23062681  0.04827926
3   0.50518377  0.28811377  0.01184018
4   0.04106266 -0.85230469 -0.28150053
5   0.19244324  0.25739150 -0.03539714
6  -0.31722642 -1.36826320 -0.68331669
7   1.48740413 -0.05923145  2.13633374
8   0.63805589 -0.70888114 -0.83978457
9   1.42104234  0.75622827  0.83117970
10 -0.55051748 -1.65601708  0.41827418

应用我的代码后:

> new.dat
         var1       var2        var3
1  0.85647777 -0.5045655  1.76600194
2  0.56284689 -0.3124571  1.05971504
3  0.26893906 -0.1369094  0.39435505
4  0.09054923 -0.1186259 -0.15040237
5  0.18381641 -0.4725185 -0.04259514
6  0.40755479 -0.4982544  0.23026628
7  0.67075652 -0.4481397  0.30250611
8  0.64421508 -0.4552548  0.41389728
9  0.48725209 -0.5845782  0.44169083
10 0.27764338 -0.7238709  0.44952801
于 2016-06-26T10:51:45.980 回答