约()没有重复?

时间:2014-05-07 09:15:28

标签: r interpolation

我正在使用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()无法正确理解的内容?

2 个答案:

答案 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")

它不会阻止在中间某处插入现有点(确切地说,下图中会发生这种情况)。 enter image description here

答案 1 :(得分:0)

如果您有机会,

approx将适合所有原始数据点(将n=5更改为xout=df$x以查看此内容)。插值是在给定未观察到的x值的情况下为y生成值的过程,但如果先前已经观察到x的值,则应该一致。

method="linear"设置即将“绘制”&#39;线性段完全连接原始坐标(因此将给出为整数x输入的y值)。你只观察到新的&#39; y值因为n = 5意味着对于开头和结尾以外的点,x不是整数(因此不是您的输入值之一),因此会进行插值。

如果您希望观察值不能完全再现,那么可能会通过rnorm添加一些噪音?