#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]. Но что, если индекс точки изменения изменяется с каждым графиком. Возможно ли это?