【发布时间】:2017-10-26 16:39:32
【问题描述】:
我想使用 dplyr、管道和 spline() 插入缺失值。
数据:
test <- structure(list(site = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("lake", "stream", "wetland"
), class = "factor"), depth = c(0L, -3L, -4L, -8L, -10L, -14L,
0L, -1L, -3L, -5L, 0L, -2L, -4L, -6L), var1 = c(NA, 1L, 3L, NA,
6L, NA, 1L, 2L, NA, 4L, 1L, NA, NA, 4L), var2 = c(1L, NA, 3L,
4L, 8L, NA, NA, NA, NA, NA, NA, 2L, NA, NA)), .Names = c("site",
"depth", "var1", "var2"), class = "data.frame", row.names = c(NA,
-14L))
Q1:如何使用以下功能代码,但限制每个变量的第一个非NA 值和最后一个非NA 值之间的插值范围。例如,它应该只在深度-8 处插入var1 为wetland,并为深度0 和-14 返回NA。
library(tidyverse)
test_int <- test %>%
group_by(site) %>%
mutate_at(vars(c(var1, var2)),
funs("i" = if(sum(!is.na(.)) > 1)
spline(x=depth, y=., xout=depth)[["y"]]
else
NA))
Q2:有没有办法将我的插值从0 绑定到Inf?或者这不适用于样条曲线(例如,我应该使用另一种插值方法,例如 smooth 或 loess)?
【问题讨论】:
-
对于边界问题,我会使用适当的转换。也就是说,也许不是插值
y,而是插值log(y)(或者可能是log1p(y),如果你有0),然后将逆变换应用于预测。 -
您是否希望内插值大于组的最大值?例如:
6.7代表wetland深度-8? (如果您确实希望将插值限制在var的最大值和最小值内,我可以提供一个解决方案。) -
@JensLeerssen 我认为将插值限制为最大和最小观察值可能会起作用。
标签: r dplyr interpolation spline