R语言 - 将数据排序到范围内; 平均; 忽略异常值

klo*_*onq 5 r outliers

我正在分析来自风力涡轮机的数据,通常这是我在excel中会做的事情,但数据量需要一些重负荷.我之前从未使用过R,所以我只是在寻找一些指针.

数据由2列WindSpeedPower组成,到目前为止,我已经从CSV文件导入数据并将两者相互分散.

接下来我要做的是将数据分类到范围内; 例如,WindSpeed在x和y之间的所有数据,然后找到每个范围生成的平均功率,并绘制形成的曲线图.

根据这个平均值,我想根据平均值的两个标准差之一(基本上忽略异常值)之一的数据重新计算平均值.

任何指针都表示赞赏.

对于那些感兴趣的人,我正在尝试创建一个类似于的图表.它是一种非常标准的图形类型,但正如我所说,剪切数据量需要比excel更重的东西.

had*_*ley 5

由于您不再使用Excel,为什么不使用不需要粗略分类数据的现代统计方法和特殊方法来删除异常值:本地平滑回归,由黄土实现.

使用csgillespie的示例数据略微修改:

w_sp <- sample(seq(0, 100, 0.01), 1000)
power <- 1/(1+exp(-(w_sp -40)/5)) + rnorm(1000, sd = 0.1)

plot(w_sp, power)

x_grid <- seq(0, 100, length = 100)
lines(x_grid, predict(loess(power ~ w_sp), x_grid), col = "red", lwd = 3)
Run Code Online (Sandbox Code Playgroud)


Rei*_*son 2

将这个版本与 @hadley 的动机类似,使用具有自适应平滑器的加性模型和包进行混合mgcv

首先是虚拟数据,如 @hadley 使用的

w_sp <- sample(seq(0, 100, 0.01), 1000)
power <- 1/(1+exp(-(w_sp -40)/5)) + rnorm(1000, sd = 0.1)
df <- data.frame(power = power, w_sp = w_sp)
Run Code Online (Sandbox Code Playgroud)

gam()使用自适应平滑器和通过 REML 选择平滑度来拟合加性模型

require(mgcv)
mod <- gam(power ~ s(w_sp, bs = "ad", k = 20), data = df, method = "REML")
summary(mod)
Run Code Online (Sandbox Code Playgroud)

根据我们的模型进行预测并获取拟合标准误差,使用后者生成大约 95% 的置信区间

x_grid <- with(df, data.frame(w_sp = seq(min(w_sp), max(w_sp), length = 100)))
pred <- predict(mod, x_grid, se.fit = TRUE)
x_grid <- within(x_grid, fit <- pred$fit)
x_grid <- within(x_grid, upr <- fit + 2 * pred$se.fit)
x_grid <- within(x_grid, lwr <- fit - 2 * pred$se.fit)
Run Code Online (Sandbox Code Playgroud)

绘制所有内容和黄土拟合以进行比较

plot(power ~ w_sp, data = df, col = "grey")
lines(fit ~ w_sp, data = x_grid, col = "red", lwd = 3)
## upper and lower confidence intervals ~95%
lines(upr ~ w_sp, data = x_grid, col = "red", lwd = 2, lty = "dashed")
lines(lwr ~ w_sp, data = x_grid, col = "red", lwd = 2, lty = "dashed")
## add loess fit from @hadley's answer
lines(x_grid$w_sp, predict(loess(power ~ w_sp, data = df), x_grid), col = "blue",
      lwd = 3)
Run Code Online (Sandbox Code Playgroud)

自适应平滑拟合和黄土拟合