обнаружение точки изменения с помощью ggplot

#r #ggplot2 #shiny

#r #ggplot2 #блестящий

Вопрос:

Я разрабатываю блестящее приложение, в котором я загружаю и считываю несколько файлов данных. Я хочу обнаружить changepoint в соответствии с cpt.meanvar . Для этого я использую пакеты changepoint и changepoint.np .

Я хочу иметь возможность извлекать определенную часть графика (т. Е. набор данных), который будет использоваться для дальнейшего анализа и обработки в приложении shiny. Эта часть должна быть способна обнаруживаться и извлекаться путем обнаружения точек изменения.

 M2 <- data.frame(x,y)
  

Вот моя попытка определить точку изменения и отобразить их на графике:

 df1 <- data.frame(x = M2[,1], y = (M2[,2]-min(M2[1,2])))
mcpt <- changepoint::cpt.meanvar(df1$y, method = "PELT")
plot(mcpt)
  

Это генерирует обычный график, хотя на самом деле это должна быть диаграмма рассеяния.

Вот как выглядит график: введите описание изображения здесь

Вопрос 1) Как можно сделать то же самое с ggplot или plotly ?

Вопрос 2) Если бы я должен был отделить какую-то определенную часть этой диаграммы рассеяния и использовать эту часть для дальнейшего анализа, как я могу это сделать? Например, если я хочу, чтобы приложение автоматически обнаруживало и извлекало точки данных средней плоской поверхности, которая находится выше строки 0.

Ответ №1:

Вы могли бы получить индексы точек изменения и атрибуты для создания графиков:

 df1 <- data.frame(x=1:200,y = c(rnorm(100,1,1),rnorm(100,-1,2)))
plot(y)
mcpt <- changepoint::cpt.meanvar(df1$y, method = "PELT")

# Get the index of change points:
mcpt.pts <- attributes(mcpt)$cpts 
mcpt.pts 

# Get the position of the change points:
df1$x[mcpt.pts]

# Get mean and variance of the different segments
mcpt.var<- attributes(mcpt)$param.est$var
mcpt.var
mcpt.mean<- attributes(mcpt)$param.est$mean
mcpt.mean


# Plot with ggplot :
df1$mean <- rep(mcpt.mean,c(mcpt.pts[1],diff(mcpt.pts)))
library(ggplot2)
ggplot(df1) geom_point(aes(x=x,y=y)) geom_line(aes(x=x,y=mean),color='red')

  

введите описание изображения здесь

Если вы хотите автоматически отображать каждый раздел между точками изменения:

 for (i in 1:length(mcpt.pts)) {
  if (i==1) {
      startidx <- 1 } else {
      startidx <-mcpt.pts[i-1]  
      }
  stopidx <- mcpt.pts[i]
  p <- ggplot(df1[startidx:stopidx,]) geom_point(aes(x=x,y=y)) geom_line(aes(x=x,y=mean),color='red')
  print(p)
  readline(prompt="Press [enter] to continue")
}
  

Комментарии:

1. Я не смог полностью понять ваш ответ, не могли бы вы, пожалуйста, немного уточнить.

2. Поскольку вы не предоставили свои данные, смотрите Мою правку для примера

3. Спасибо за ваш ответ, это было полезно. Теперь, что касается моего 2-го вопроса. Как я могу извлечь определенную часть данных диаграммы рассеяния? например. на вашей диаграмме рассеяния есть две красные горизонтальные линии и одна вертикальная линия. Если я хочу извлечь точки разброса, относящиеся только к первой горизонтальной линии. Если меня не интересуют другие точки рассеяния, которые находятся за пределами этой зоны. Как я могу это извлечь?

4. mcpt.pts выдает индексы точек изменения: 100, 200. Таким образом, первая секция расположена между индексами 1-100, а вторая — между индексами 101-200. Данные для первого раздела : df1[1:100,] просто используйте это вместо df1 в ggplot вызове.

5. Я понимаю, но в этом случае вы знаете, где были точки изменения, поэтому вы могли бы указать начало и конечную точку требуемого набора данных в этой форме df1[1:100]. Но что, если индекс точки изменения изменяется с каждым графиком. Возможно ли это?