Vamos gerar nosso dataset com 2 variáveis independentes (X e Z)
In [15]:
    
set.seed(42)
X = seq(from = 1.5, to = 3.0, length.out = 100)
set.seed(42)
Y <- unlist(lapply(X, function(x) {x^4 + runif(1)*6.5}))
set.seed(42)
Z <- unlist(lapply(X*Y, function(x) {x + runif(1)*3.2}))
    
In [18]:
    
#install.packages('scatterplot3d')
library(scatterplot3d)
    
    
In [19]:
    
scatterplot3d(X, Y, Z, highlight.3d=TRUE, col.axis="blue",
      col.grid="lightblue", main="Dados", pch=20)
    
    
Train/Test split Precisamos dividir nossos dados em dados de treino e de teste:
In [37]:
    
set.seed(42) 
indices_x <- sample.int(n = length(X), size = floor(.75*length(X)), replace = FALSE)
x_treino <- X[indices_x]
x_teste  <- X[-indices_x]
set.seed(42) 
indices_y <- sample.int(n = length(Y), size = floor(.75*length(Y)), replace = FALSE)
y_treino <- Y[indices_y]
y_teste  <- Y[-indices_y]
    
In [36]:
    
plot(x_treino,y_treino)
    
    
In [45]:
    
library(rpart)
    
In [82]:
    
df_treino <- data.frame(x = x_treino, y = y_treino)
y <- df_treino$y
x <- df_treino$x
modelo <- rpart(y ~ x, method = "anova")
summary(modelo)
    
    
In [68]:
    
print(modelo)
    
    
In [69]:
    
rsq.rpart(modelo)
    
    
    
    
In [70]:
    
printcp(modelo)
    
    
In [71]:
    
plotcp(modelo)
    
    
In [72]:
    
plot(modelo, uniform=TRUE, 
  	main="Árvore gerada")
text(modelo, use.n=TRUE, all=TRUE, cex=.8)
    
    
In [73]:
    
min.xerror <- modelo$cptable[which.min(modelo$cptable[,"xerror"]),"CP"]
min.xerror
    
    
In [74]:
    
modelo_podado <- prune(modelo,cp = min.xerror) 
plot(modelo_podado, uniform=TRUE, 
  	main="Árvore podada")
text(modelo_podado, use.n=TRUE, all=TRUE, cex=.8)
    
    
Nossa árvore já está do tamanho correto, logo, não é necessário podar
In [83]:
    
df_teste <- data.frame(x = x_teste, y = y_teste)
y <- df_teste$y
x <- df_teste$x
predicoes <- predict(modelo, newdata = df_teste)
    
In [85]:
    
predicoes
    
    
In [65]:
    
str(x_teste)
    
    
In [92]:
    
plot(x_treino,y_treino)
lines(x_teste,predicoes,col=2,lwd=3,type="b")
    
    
Como vemos, nossas predições, utilizando os dados de teste, estão seguindo a curva original da amostra.
In [93]:
    
set.seed(42) 
indices_x <- sample.int(n = length(X), size = floor(.75*length(X)), replace = FALSE)
x_treino <- X[indices_x]
x_teste  <- X[-indices_x]
set.seed(42) 
indices_y <- sample.int(n = length(Y), size = floor(.75*length(Y)), replace = FALSE)
y_treino <- Y[indices_y]
y_teste  <- Y[-indices_y]
set.seed(42) 
indices_z <- sample.int(n = length(Z), size = floor(.75*length(Z)), replace = FALSE)
z_treino <- Z[indices_z]
z_teste  <- Z[-indices_z]
    
In [94]:
    
df_treino <- data.frame(x = x_treino, y = y_treino, z = z_treino)
y <- df_treino$y
x <- df_treino$x
z <- df_treino$z
modelo <- rpart(y ~ x + z, method = "anova")
summary(modelo)
    
    
In [95]:
    
df_teste <- data.frame(x = x_teste, y = y_teste, z = z_teste)
y <- df_teste$y
x <- df_teste$x
z <- df_teste$z
predicoes <- predict(modelo, newdata = df_teste)
    
In [96]:
    
predicoes
    
    
In [118]:
    
plot1 <- scatterplot3d(X, Y, Z, highlight.3d=TRUE, col.axis="blue",
      col.grid="lightblue", main="Dados", pch=20)
plot1$points3d(df_teste$x, predicoes, df_teste$z, col = 4, pch=13, cex=3)
    
    
Os pontos marcados com um alvo em azul, são nossas predições. Note que, no geral, acertamos bastante.
In [ ]: