我正在使用approx()
来插值。
x <- 1:20
y <- c(3,8,2,6,8,2,4,7,9,9,1,3,1,9,6,2,8,7,6,2)
df <- cbind.data.frame(x,y)
> df
x y
1 1 3
2 2 8
3 3 2
4 4 6
5 5 8
6 6 2
7 7 4
8 8 7
9 9 9
10 10 9
11 11 1
12 12 3
13 13 1
14 14 9
15 15 6
16 16 2
17 17 8
18 18 7
19 19 6
20 20 2
interpolated <- approx(x=df$x, y=df$y, method="linear", n=5)
告诉我这个:
interpolated
$x
[1] 1.00 5.75 10.50 15.25 20.00
$y
[1] 3.0 3.5 5.0 5.0 2.0
现在,第一个和最后一个值是我的真实数据的重复,是否有任何方法可以防止这种情况,或者是我对approx()
无法正确理解的内容?
答案 0 :(得分:1)
您可能需要指定xout
以避免这种情况。例如,如果您想要始终排除第一个和最后一个点,请按照以下方式进行操作:
specify_xout <- function(x, n) {
seq(from=min(x), to=max(x), length.out=n+2)[-c(1, n+2)]
}
plot(df$x, df$y)
points(approx(df$x, df$y, xout=specify_xout(df$x, 5)), pch = "*", col = "red")
它不会阻止在中间某处插入现有点(确切地说,下图中会发生这种情况)。
答案 1 :(得分:0)
approx
将适合所有原始数据点(将n=5
更改为xout=df$x
以查看此内容)。插值是在给定未观察到的x值的情况下为y生成值的过程,但如果先前已经观察到x的值,则应该一致。
method="linear"
设置即将“绘制”&#39;线性段完全连接原始坐标(因此将给出为整数x输入的y值)。你只观察到新的&#39; y值因为n = 5意味着对于开头和结尾以外的点,x不是整数(因此不是您的输入值之一),因此会进行插值。
如果您希望观察值不能完全再现,那么可能会通过rnorm
添加一些噪音?