3D Scatterplot с Plotly In R - невозможно точно подогнать плоскость регрессии - PullRequest
0 голосов
/ 13 января 2019

Имеются некоторые проблемы с точной подгонкой плоскости регрессии к трехмерной диаграмме рассеяния с использованием Plotly и R.

Я могу подогнать плоскость, однако плоскость явно не похожа на точки данных / регрессию в моих данных.

Есть некоторые похожие посты, которые имеют дело с похожими проблемами - я пытался следовать шаблонам, изложенным в этих постах, но, к сожалению, я не приблизился к поиску решения.

Похожие сообщения: 1. Как добавить поверхности таких плоскостей, как следы, сгенерированные математические формулы на трехмерном графике рассеяния в графически в r? 2. Добавить плоскость регрессии к трехмерному графику рассеяния на графике

Мой код можно найти ниже:

# Load packages    

library(readxl)
library(plotly)
library(dplyr)
library(data.table)    

# Generate Data Frame    

Test_Score = c(99, 54, 26, 63, 48, 75, 26, 54, 38, 28, 81, 35, 91, 72, 51, 23, 96, 36, 33, 98, 28)
Time_Studying = c(10, 4, 2, 6, 5, 8, 2, 3, 2, 1, 9, 3, 9, 7, 5, 1, 10, 3, 3, 8, 2)
Time_PlayingDiablo = c(1, 4, 7, 3, 3, 2, 7, 4, 5, 7, 3, 6, 1, 2, 5, 9, 3, 9, 8, 1, 9)    

raw_data <- data.frame(cbind(Test_Score,Time_Studying,Time_PlayingDiablo))    


# Construct initial 3D scatter plot using plotly (this part works)    


p <- plot_ly(raw_data,x=raw_data$Time_Studying,
                       y=raw_data$Test_Score,
                       z=raw_data$Time_PlayingDiablo,type='scatter3d',mode='markers') %>% 

    layout(
      title = "Test Score Regression",
      scene = list(
        xaxis = list(title = "Time Studying"),
        yaxis = list(title = "Study Score"),
        zaxis = list(title = "Time Playing Games")
    ))

p    

# Fit a linear regression model    

model2 <- lm(Test_Score ~ Time_PlayingDiablo + Time_Studying, raw_data)
summary(model2)    



# Fit a 3D plane to the plot showing the regression model, using the following stackoverflow QA 
# as a template     

# --> (https://stackoverflow.com/questions/38331198/add-regression-plane-to-3d-scatter-plot-in-plotly)
# and this too 
# --> https://stackoverflow.com/questions/46326005/how-do-i-add-surfaces-such-a-planes-as-traces-generated-mathematical-formulas-in    

# Set graph resolution    

graph_reso <- 1    

# Setup axis
axis_x <- seq(min(raw_data$Time_Studying), max(raw_data$Time_Studying), graph_reso)
axis_y <- seq(min(raw_data$Time_PlayingDiablo), max(raw_data$Time_PlayingDiablo), graph_reso)    

# Sample points
reg_surface <- expand.grid(Time_Studying = axis_x, Time_PlayingDiablo= axis_y,KEEP.OUT.ATTRS = F)
reg_surface$Model2_Predict <- round(predict(model2, newdata = reg_surface),0)
reg_surface2 <- acast(reg_surface, Time_Studying ~ Time_PlayingDiablo, value.var = "Model2_Predict")    


######################################################
#  ---- THIS IS THE PART THAT DOESN"T WORK ----
# Add surface/plane to our scatterplot 
######################################################    

p2 <- add_trace(p,
                x = axis_x,
                y = axis_y,
                z = reg_surface2,
                type = "surface", inherit=FALSE)    

p2

При рендеринге p2 я получаю следующую трехмерную диаграмму: enter image description here

Очевидно, неточная подгонка. Взглянув на таблицу 'reg_surface2', вы увидите разумно выглядящие прогнозные значения для модели (то есть студенты, которые много часов занимаются и играют в Diablo несколько часов, получают хорошие результаты), поэтому это не проблема с самими данными.

Почему эти цифры не переводятся в трехмерную плоскую диаграмму? ...

...