R: Найти пересечение двух векторов

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

Итак, вот очень простой пример фрейма данных:

df <- data.frame( id <- c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2),
                 p <-c(5,7,9,11,13,15,17,19,21,23,20,18,16,14,12,10,8,6,4,2 ),
                 q <-c(3,5,7,13,19,31,37,53,61,67,6,18,20,24,40,46,66,70,76,78))
colnames(df) <- c("id","price","quantity")

supply <- df[df$id == 1,]
demand <- df[df$id == 2,]

plot( x = supply$quantity,  y = supply$price, type = "l", ylab = "price", xlab = "quantity")
lines(x = demand$quantity , y = demand$price, type = "l")
grid()

Теперь я могу нарисовать их и найти пересечение вручную, но можете ли вы заставить R вычислить пересечение между этими двумя линиями?

Данные могут совершать огромные скачки, а линии могут меняться от очень ступенчатых до почти горизонтальных.


person Thorst    schedule 21.10.2013    source источник
comment
Если это линии! Я подозреваю, что вам нужно немного изучить математику, прежде чем идти дальше. Пожалуйста, найдите материал о линейной подгонке (линейной регрессии), а затем перейдите к любой книге по геометрии, чтобы получить формулу пересечения двух (непараллельных) линий.   -  person Carl Witthoft    schedule 21.10.2013
comment
Данные в лучшем случае являются кусочно-линейными, поэтому вы не можете сделать линейную аппроксимацию, это не даст правильного результата.   -  person Thorst    schedule 21.10.2013
comment
В этом случае вам нужно придумать определение пересечения. Например, вы хотите, чтобы пересечение сплайнов соответствовало? Какую реальную проблему вы пытаетесь решить? (цитируя гуру Data Munger) Поиск пересечения, если ваши исходные данные дрянные, вам не поможет.   -  person Carl Witthoft    schedule 21.10.2013
comment
@Carl: Мне кажется, что OP пытается выяснить равновесное количество и равновесную цену: количество / цена, по которой количество спроса-количество предложения. Это не вопрос программирования для меня. Голосование за закрытие   -  person Metrics    schedule 21.10.2013
comment
Этот вопрос кажется не по теме, потому что он касается экономики.   -  person Metrics    schedule 21.10.2013
comment
Да, речь идет об экономике, но это проблема программирования, с которой я столкнулся в R. Как это может быть не по теме?   -  person Thorst    schedule 21.10.2013
comment
Если он кусочно-линейный, вы можете рассчитать пересечение для каждой комбинации линий с помощью метода, описанного здесь in-r?rq=1" title="поиск пересечения двух линейных подгонок в r">stackoverflow.com/questions/7114703/ и остановка, когда пересечение находится между двумя точками одной из линий, используемых для рассчитать перекресток.   -  person Jonas Tundo    schedule 21.10.2013
comment
Вы пробовали crossing.psp в пакете spatstat? Находит любые точки пересечения между двумя шаблонами сегментов линий.   -  person Henrik    schedule 21.10.2013


Ответы (1)


Будьте осторожны при создании фрейма данных. Вы хотите =, а не <-. Также сделайте id фактором, для ясности.

df <- data.frame( 
  id       = factor(rep(c("supply", "demand"), each = 10)),
  price    = c(5,7,9,11,13,15,17,19,21,23,20,18,16,14,12,10,8,6,4,2 ),
  quantity = c(3,5,7,13,19,31,37,53,61,67,6,18,20,24,40,46,66,70,76,78)
)

Сначала мы определяем общие, частые точки для оценки количества.

quantity_points <- with(
  df,
  seq(min(quantity), max(quantity), length.out = 500)
)

Теперь разделите набор данных на части спроса/предложения.

by_id <- split(df[, c("price", "quantity")], df$id)

Затем мы используем approx для расчета цены для каждого из этих количеств, для спроса и предложения отдельно.

interpolated_price <- lapply(
  by_id,
  function(x)
  {
    with(
      x,
      approx(
        quantity,
        price, 
        xout = quantity_points
      )
    )$y       
  }
)

Наконец, точка пересечения — это место, где минимизируется абсолютное значение цены предложения за вычетом цены спроса.

index_of_equality <- with(interpolated_price, which.min(abs(supply - demand)))
quantity_points[index_of_equality]
person Richie Cotton    schedule 21.10.2013
comment
Спасибо! Просто быстрое продолжение, почему = вместо <-? - person Thorst; 22.10.2013
comment
<- создает векторы id, p, q, а также df. См. stackoverflow.com/q/1741820/134830. - person Richie Cotton; 22.10.2013