将 LOESS 过滤器/回归应用于我的数据框的所有列
Apply LOESS filter / regression to all columns of my data frame
我有一个包含 100 列数值的数据框,其中每一列都是第一列的不同循环移位。我需要在这些列上逐一放置一个 LOESS 过滤器。在我的上下文中,协变量很简单,只是索引 1, 2, 3, ..., <number of rows>
.
如何获得新数据框中的平滑值?谢谢!
假设你的数据框叫做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
我有一个包含 100 列数值的数据框,其中每一列都是第一列的不同循环移位。我需要在这些列上逐一放置一个 LOESS 过滤器。在我的上下文中,协变量很简单,只是索引 1, 2, 3, ..., <number of rows>
.
如何获得新数据框中的平滑值?谢谢!
假设你的数据框叫做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