R: понимание различий между двумя графиками

#r #3d #plotly #data-visualization #simulation

#r #3D #сюжетно #визуализация данных #Симуляция

Вопрос:

Я использую язык программирования R. Я следую этому руководству здесь: https://plotly.com/r/3d-line-plots /

Я скопировал и вставил следующий код и успешно создал этот график:

 library(plotly)

data <- read.csv('https://raw.githubusercontent.com/plotly/datasets/master/_3d-line-plot.csv')

fig <- plot_ly(data, x = ~x1, y = ~y1, z = ~z1, type = 'scatter3d', mode = 'lines',
        line = list(color = '#1f77b4', width = 1))
fig <- fig %>% add_trace(x = ~x2, y = ~y2, z = ~z2,
            line = list(color = 'rgb(44, 160, 44)', width = 1))
fig <- fig %>% add_trace(x = ~x3, y = ~y3, z = ~z3,
            line = list(color = 'bcbd22', width = 1))

fig
 

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

При предварительном просмотре данных, используемых для создания этого 3D-графика, он выглядит следующим образом:

 > head(data)
           x1         y1        z1         x2         y2          z2
1 -0.01446036 -0.7007406 0.7132696 -0.5876227  0.2779929  -0.7598812
2  0.42072305 -4.2273350 3.1998977 -1.0323807 -0.4265484  -5.4042929
3  0.47195564 -3.3451935 2.0209429 -0.9554478 -3.3332747  -7.1266061
4 -1.59808508 -5.2404711 1.4572559  0.7305834 -2.8338860 -10.2886736
5 -1.16969290 -4.3295068 1.9317851  2.9333971 -1.0720493 -11.5012063
6  0.62887816 -1.7364294 3.2375436  4.2536182 -4.1168275 -13.0858438
          x3          y3         z3
1 -0.3666438  0.67189166 -0.6435324
2  1.4686770 -0.28710213  1.1944073
3  1.4915815  2.09425411  1.7574972
4  2.6986862 -0.04325033 -2.0862012
5  2.6568411  0.01913790 -3.1839338
6 -1.5095767 -2.69654294 -0.2990162
> str(data)
'data.frame':   1001 obs. of  9 variables:
 $ x1: num  -0.0145 0.4207 0.472 -1.5981 -1.1697 ...
 $ y1: num  -0.701 -4.227 -3.345 -5.24 -4.33 ...
 $ z1: num  0.713 3.2 2.021 1.457 1.932 ...
 $ x2: num  -0.588 -1.032 -0.955 0.731 2.933 ...
 $ y2: num  0.278 -0.427 -3.333 -2.834 -1.072 ...
 $ z2: num  -0.76 -5.4 -7.13 -10.29 -11.5 ...
 $ x3: num  -0.367 1.469 1.492 2.699 2.657 ...
 $ y3: num  0.6719 -0.2871 2.0943 -0.0433 0.0191 ...
 $ z3: num  -0.644 1.194 1.757 -2.086 -3.184 ...
 

В качестве учебного упражнения я попытался создать аналогичный набор данных и выполнить ту же процедуру:

 x1 = rnorm(1000,10,10)
x2 = rnorm(1000,10,10)
x3 = rnorm(1000,10,10)
y1 = rnorm(1000,10,10)
y2 = rnorm(1000,10,10)
y3 = rnorm(1000,10,10)
z1 = rnorm(1000,10,10)
z2 = rnorm(1000,10,10)
z3 = rnorm(1000,10,10)
data = data.frame(x1,x2,x3,y1,y2,y3,z1,z2,z3)


fig <- plot_ly(data, x = ~x1, y = ~y1, z = ~z1, type = 'scatter3d', mode = 'lines',
        line = list(color = '#1f77b4', width = 1))
fig <- fig %>% add_trace(x = ~x2, y = ~y2, z = ~z2,
            line = list(color = 'rgb(44, 160, 44)', width = 1))
fig <- fig %>% add_trace(x = ~x3, y = ~y3, z = ~z3,
            line = list(color = 'bcbd22', width = 1))

fig
 

Но график, который получается из этого кода, выглядит совершенно иначе:

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

Может кто-нибудь, пожалуйста, помочь мне понять, почему два графика отличаются друг от друга и как я могу изменить второй график, чтобы он больше походил на первый график?

Спасибо

Ответ №1:

Проблема в том, что вы ошибочно принимаете случайное распределение за случайное блуждание. Данные, которые вы пытаетесь реплицировать, следуют случайному блужданию.

Для этого давайте создадим функцию, которая генерирует данные случайного блуждания, такие как,

 random_walk <- function(n,mean,sd) {

        out <- vector()
        initial <- rnorm(1,10,10)
        out[1] <- initial
        for(i in 2:n) {

        out[i] <- out[i-1]   rnorm(1,mean,sd)
                        }
        return(out)

    }
 

Теперь мы можем создать весь наш набор данных, используя нашу функцию,

 x1 <- random_walk(1000,0,1)
x2 <- random_walk(1000,0,1)
x3 <- random_walk(1000,0,1)

y1 <- random_walk(1000,0,1)
y2 <- random_walk(1000,0,1)
y3 <- random_walk(1000,0,1)

z1 <- random_walk(1000,0,1)
z2 <- random_walk(1000,0,1)
z3 <- random_walk(1000,0,1)


data_new = data.frame(x1,x2,x3,y1,y2,y3,z1,z2,z3)
 

Наконец, мы можем построить его,

 fig_new <- plot_ly(data_new, x = ~x1, y = ~y1, z = ~z1, type = 'scatter3d', mode = 'lines',
            line = list(color = '#1f77b4', width = 1))
fig_new <- fig_new %>% add_trace(x = ~x2, y = ~y2, z = ~z2,
            line = list(color = 'rgb(44, 160, 44)', width = 1))
fig_new <- fig_new %>% add_trace(x = ~x3, y = ~y3, z = ~z3,
            line = list(color = 'bcbd22', width = 1))

fig_new
 

что дает,

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

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

1. Вы можете выполнить случайное блуждание для каждого вектора с cumsum(rnorm(1000, 0, 10)) помощью .

2. На самом деле, теперь, когда я думаю об этом, вы можете сэкономить кучу ввода, выполнив что-то вроде library(tidyverse); data = paste0(rep(c("x","y","z"), each=3), 1:3) %>% set_names() %>% map_df(~assign(.x, cumsum(rnorm(1000,0,10))))

3. Спасибо за ответ! Не могли бы вы объяснить, почему для построения этого графика должна быть определена функция случайного блуждания? Предположим, у меня есть наблюдения из реальной жизни (например, ежедневный заработок финансовой компании), и я хочу построить такой график. Это все еще возможно? Спасибо!

4. Нет необходимости отображать данные случайного блуждания или какие-либо данные определенного типа. Просто график будет выглядеть по-разному в зависимости от структуры данных. При случайном блуждании местоположение каждой новой точки соотносится с предыдущими точками, поэтому 3D-график формирует «красивые» пути, каждый из которых можно визуализировать и понимать. Тем не менее, rnorm(1000,10,10) создает данные, которые могут перемещаться в любом месте от одной точки к другой, делая зигзагообразные движения и создавая сплошной шар точек, который вы нашли при построении своего графика.

5. Это может быть легче увидеть в 1 измерении. Попробуйте запустить эти строки кода несколько раз (первая строка предназначена только для того, чтобы оба графика были нарисованы вместе): par(mfrow=c(1,2)); plot(1:1000, rnorm(1000, 0, 10), type="l"); plot(1:1000, cumsum(rnorm(1000, 0, 10)), type="l") . Первый график похож на созданные вами случайные данные. Обратите внимание, как точки прыгают вверх и вниз (примерно в пределах 2 стандартных отклонений от нуля) от одной точки к следующей, потому что каждая точка полностью независима от предыдущей. Второй график представляет собой случайное блуждание, где каждая последующая точка близка к предыдущей.