2015-10-14 5 views
2

Предположим, у меня есть данные:Как оценить координаты точек вдоль графированной линии в R?

x <- c(1900,1930,1944,1950,1970,1980,1983,1984) 
y <- c(100,300,500,1500,2500,3500,4330,6703) 

Я тогда сюжет эти данные и добавить линейный график между моей известной х и у координаты:

plot(x,y) 
lines(x,y) 

Есть ли способ предсказать координаты искомых точек вдоль графической линии?

+0

https://www.mathsisfun.com/algebra/line-equation-2points.html – user20650

+0

@ user20650 Мне хорошо известно, как это сделать вручную. Возможно, я должен был быть более конкретным: есть ли функция, которая делает это для меня? – theforestecologist

+0

Извинения, мой комментарий был слишком коротким. Решение 'approxfun' на кушетке ниже - это, безусловно, путь, но вы можете легко запрограммировать уравнения для строк, указанных в ссылке. – user20650

ответ

3

Вы можете использовать approxfun.

f <- approxfun(x, y=y) 

f(seq(1900, 2000, length.out = 10)) 
# [1] 100.0000 174.0741 248.1481 347.6190 574.0741 1777.7778 2333.3333 
# [8] 3277.7778  NA  NA 

Примечания НС, когда последовательность находится вне диапазона интерполированных точек (есть левые и правые варианты approxfun).

0

Вы можете вручную рассчитать наклоны каждой линии.

Уравнение линии задается

y − y1 = grad*(x − x1) 

, где grad рассчитывается по изменению у деленному на изменение х

Мы можем произвести уравнения для каждой строки с помощью двух точек из каждая строка в сюжете.

f2 <- function(xnew, X=x, Y=y) { 
      id0 <- findInterval(xnew, X, rightmost=T) 
      id1 <- id0 + 1 
      grad <- (Y[id1] - Y[id0])/(X[id1] - X[id0]) 
      Y[id0] + grad* (xnew - X[id0]) 
} 

f2(x) 
#[1] 100 300 500 1500 2500 3500 4330 6703 

f <- approxfun(x, y=y) # bunks 
f(seq(1900, 2000, length.out = 10)) 
# [1] 100.0000 174.0741 248.1481 347.6190 574.0741 1777.7778 2333.3333 3277.7778  NA  NA 
f2(seq(1900, 2000, length.out = 10)) 
# [1] 100.0000 174.0741 248.1481 347.6190 574.0741 1777.7778 2333.3333 3277.7778  NA  NA 

Если вы хотите экстраполировать, используя конечный наклон, вы можете сделать это, добавив all.in=TRUE аргумент в findInterval.

С учетом этого approxfun делает это лучше & проще!