Построить линии тренда (не плоскости или гладкие поверхности) на интерактивных трехмерных графиках в R - PullRequest
1 голос
/ 03 апреля 2020

Я хочу построить линию тренда (не плоскость или гладкую поверхность) на интерактивном трехмерном графике в R.

Вот код, который у меня пока есть:

library (car)
set.seed(1)
x <- 1:100 + rnorm(100, 5, 5)
y <- x + rnorm(100, 10, 20)
z <- y + rnorm(100, 1, 10)
scatter3d(x = x, y = y, z = z, surface = F)

По сути, я хочу построить на этом графике линию тренда, которая проходит через область максимальной изменчивости в этом облаке точек. Эта линия тренда, конечно же, является первой осью главных компонентов. Я знаю, как выполнить анализ основных компонентов на этих данных:

df <- data.frame(x, y, z)
prcomp(df, center = T, scale. = T)

Как я могу построить оси главных компонентов на этой диаграмме рассеяния?

(я, конечно, открыт для использования различных пакетов для создания интерактивных трехмерных диаграмм рассеяния. Я начал использовать функцию scatter3d в пакете car, поскольку пакет plotly доставлял мне проблемы - я продолжал получать сообщение WebGL is not supported by your browser - visit https://get.webgl.org for more info, когда пытался создать 3- трехмерные графики с использованием функции plotly.

Спасибо!

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Следуя отличному ответу StupidWolf, вот способ заставить строки останавливаться на максимальных и минимальных значениях ваших данных вместо произвольного выбора множителей, таких как 100:

PC1 <- rbind(pca$center + min(pca$x[, 1]) * pca$rotation[, 1], pca$center + max(pca$x[, 1]) * pca$rotation[, 1])
colnames(PC1) = c("x", "y", "z")
segments3d(PC1, col = 1 , lwd = 2)

PC2 <- rbind(pca$center + min(pca$x[, 2]) * pca$rotation[, 2], pca$center + max(pca$x[, 2]) * pca$rotation[, 2])
colnames(PC2) = c("x", "y", "z")
segments3d(PC2, col = 2 , lwd = 2)

PC1 <- rbind(pca$center + min(pca$x[, 3]) * pca$rotation[, 3], pca$center + max(pca$x[, 3]) * pca$rotation[, 3])
colnames(PC1) = c("x", "y", "z")
segments3d(PC1, col = 3 , lwd = 2)
1 голос
/ 04 апреля 2020

Хорошо, надеюсь, я правильно понял. Для построения главных компонентов вам нужны собственные векторы, и это дано в $rotation. Сначала мы настраиваем трехмерный график и вычисляем главный компонент:

library(rgl)
set.seed(1)
x <- 1:100 + rnorm(100, 5, 5)
y <- x + rnorm(100, 10, 20)
z <- y + rnorm(100, 1, 10)
M = cbind(x,y,z)
pca = prcomp(df, center = T, scale. = T)

Мы наносим точки:

plot3d(M)

Поскольку вы масштабировали главный компонент, нам нужно найти средства (или по центру) ваших x, y, z и постройте ПК оттуда. И поскольку P C является собственным вектором, я просто нанес на график отрезок от центра примерно до 100 * собственного вектора:

centers = colMeans(M)
PC1 = rbind(centers,centers+100*pca$rotation[,1])
colnames(PC1) = c("x","y","z")
segments3d(PC1,col="blue",lwd=2)

PC2 = rbind(centers,centers+100*pca$rotation[,2])
colnames(PC2) = c("x","y","z")
segments3d(PC2,col="orange",lwd=2)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...