library(rsm)
library(car)
library(lmtest)
library(nortest)
library(Rsolnp)
library(NlcOptim)
DOE<-bbd(k=~x1+x2+x3,
         block = F,
         n0=5,
         randomize = F,
         coding = list(x1~(ang-4)/2,
                       x2~(compr-4)/1,
                       x3~(alt-3)/1))
DOE
   run.order std.order ang compr alt
1          1         1   2     3   3
2          2         2   6     3   3
3          3         3   2     5   3
4          4         4   6     5   3
5          5         5   2     4   2
6          6         6   6     4   2
7          7         7   2     4   4
8          8         8   6     4   4
9          9         9   4     3   2
10        10        10   4     5   2
11        11        11   4     3   4
12        12        12   4     5   4
13        13        13   4     4   3
14        14        14   4     4   3
15        15        15   4     4   3
16        16        16   4     4   3
17        17        17   4     4   3

Data are stored in coded form using these coding formulas ...
x1 ~ (ang - 4)/2
x2 ~ (compr - 4)/1
x3 ~ (alt - 3)/1
DOE$y<-(c(2.71,2.75,4.17,4.12,2.42,2.61,4.36,
           4.82,2.65,3.43,3.68,5.62,3.43,3.45,
           3.82,3.46,3.68))
DOE
   run.order std.order ang compr alt    y
1          1         1   2     3   3 2.71
2          2         2   6     3   3 2.75
3          3         3   2     5   3 4.17
4          4         4   6     5   3 4.12
5          5         5   2     4   2 2.42
6          6         6   6     4   2 2.61
7          7         7   2     4   4 4.36
8          8         8   6     4   4 4.82
9          9         9   4     3   2 2.65
10        10        10   4     5   2 3.43
11        11        11   4     3   4 3.68
12        12        12   4     5   4 5.62
13        13        13   4     4   3 3.43
14        14        14   4     4   3 3.45
15        15        15   4     4   3 3.82
16        16        16   4     4   3 3.46
17        17        17   4     4   3 3.68

Data are stored in coded form using these coding formulas ...
x1 ~ (ang - 4)/2
x2 ~ (compr - 4)/1
x3 ~ (alt - 3)/1
funcao<- rsm(y~ SO(x1,x2,x3),data = DOE)
summary(funcao)

Call:
rsm(formula = y ~ SO(x1, x2, x3), data = DOE)

             Estimate Std. Error t value  Pr(>|t|)    
(Intercept)  3.568000   0.090199 39.5570 1.719e-09 ***
x1           0.080000   0.071309  1.1219   0.29892    
x2           0.693750   0.071309  9.7288 2.564e-05 ***
x3           0.921250   0.071309 12.9192 3.869e-06 ***
x1:x2       -0.022500   0.100846 -0.2231   0.82982    
x1:x3        0.067500   0.100846  0.6693   0.52473    
x2:x3        0.290000   0.100846  2.8757   0.02380 *  
x1^2        -0.211500   0.098292 -2.1518   0.06844 .  
x2^2         0.081000   0.098292  0.8241   0.43707    
x3^2         0.196000   0.098292  1.9941   0.08637 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Multiple R-squared:  0.9756,    Adjusted R-squared:  0.9443 
F-statistic: 31.16 on 9 and 7 DF,  p-value: 7.854e-05

Analysis of Variance Table

Response: y
                Df  Sum Sq Mean Sq F value    Pr(>F)
FO(x1, x2, x3)   3 10.6911  3.5637 87.6050 6.482e-06
TWI(x1, x2, x3)  3  0.3566  0.1189  2.9225    0.1096
PQ(x1, x2, x3)   3  0.3598  0.1199  2.9486    0.1079
Residuals        7  0.2848  0.0407                  
Lack of fit      3  0.1641  0.0547  1.8128    0.2846
Pure error       4  0.1207  0.0302                  

Stationary point of response surface:
        x1         x2         x3 
-0.2851951  0.6256368 -2.7638622 

Stationary point in original units:
      ang     compr       alt 
3.4296098 4.6256368 0.2361378 

Eigenanalysis:
eigen() decomposition
$values
[1]  0.29540968 -0.01347974 -0.21642994

$vectors
         [,1]       [,2]        [,3]
x1 0.04278373  0.1402676  0.98918884
x2 0.55814419 -0.8245405  0.09277986
x3 0.82864022  0.5481405 -0.11356645
funcao<-rsm(y~ FO(x1,x2,x3)+
             TWI(x2,x3)+PQ(x1,x3),data = DOE)
summary(funcao)

Call:
rsm(formula = y ~ FO(x1, x2, x3) + TWI(x2, x3) + PQ(x1, x3), 
    data = DOE)

             Estimate Std. Error t value  Pr(>|t|)    
(Intercept)  3.602105   0.072471 49.7040 2.625e-13 ***
x1           0.080000   0.064482  1.2407  0.243048    
x2           0.693750   0.064482 10.7589 8.099e-07 ***
x3           0.921250   0.064482 14.2870 5.578e-08 ***
x2:x3        0.290000   0.091191  3.1801  0.009817 ** 
x1^2        -0.207237   0.088759 -2.3348  0.041705 *  
x3^2         0.200263   0.088759  2.2563  0.047670 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Multiple R-squared:  0.9716,    Adjusted R-squared:  0.9545 
F-statistic: 56.92 on 6 and 10 DF,  p-value: 3.73e-07

Analysis of Variance Table

Response: y
               Df  Sum Sq Mean Sq  F value    Pr(>F)
FO(x1, x2, x3)  3 10.6911  3.5637 107.1372 6.685e-08
TWI(x2, x3)     1  0.3364  0.3364  10.1133  0.009817
PQ(x1, x3)      2  0.3322  0.1661   4.9939  0.031346
Residuals      10  0.3326  0.0333                   
Lack of fit     6  0.2120  0.0353   1.1709  0.459702
Pure error      4  0.1207  0.0302                   

Stationary point of response surface:
        x1         x2         x3 
 0.1930159  0.1272608 -2.3922414 

Stationary point in original units:
      ang     compr       alt 
4.3860317 4.1272608 0.6077586 

Eigenanalysis:
eigen() decomposition
$values
[1]  0.27634546 -0.07608231 -0.20723684

$vectors
        [,1]       [,2] [,3]
x1 0.0000000  0.0000000    1
x2 0.4646295  0.8855052    0
x3 0.8855052 -0.4646295    0
#======== Análise dos Resíduos ===============
curve(dnorm(x,mean(funcao$residuals),sd(funcao$residuals)),
      from = min(funcao$residuals),to=max(funcao$residuals),
      col="blue",lwd=4,main="Curva Normal dos Resíduos",
      xlab = "Observações",ylab = "Densidade")

qqnorm(funcao$residuals,lwd=3,col="blue")
qqline(funcao$residuals,lwd=3)

library(nortest)
ad.test(funcao$residuals)

    Anderson-Darling normality test

data:  funcao$residuals
A = 0.6899, p-value = 0.05845
residualPlot(funcao)

bptest(funcao)

    studentized Breusch-Pagan test

data:  funcao
BP = 1.3968, df = 6, p-value = 0.9661
durbinWatsonTest(funcao)
 lag Autocorrelation D-W Statistic p-value
   1       0.1141991      1.729611    0.43
 Alternative hypothesis: rho != 0
dwt(funcao)
 lag Autocorrelation D-W Statistic p-value
   1       0.1141991      1.729611   0.444
 Alternative hypothesis: rho != 0
#Otimização
obj=function(x){a<-predict(funcao,newdata = data.frame(x1=x[1],
                                                       x2=x[2],
                                                       x3=x[3]))
return(-a)}

x0<-c(0,0,0)
optim(par = x0,fn=obj,lower = c(-1,-1,-1),upper = c(1,1,1),
      method = c("L-BFGS-B"))
$par
[1] 0.1930159 1.0000000 1.0000000

$value
[1] -5.715089

$counts
function gradient 
       7        7 

$convergence
[1] 0

$message
[1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"
library(NlcOptim)
solnl(X=x0,objfun = obj,lb=c(-1,-1,-1),ub=c(1,1,1))
$par
          [,1]
[1,] 0.1930158
[2,] 1.0000000
[3,] 1.0000000

$fn
        1 
-5.715089 

$counts
     nfval ngval
[1,]    21     6

$lambda
$lambda$lower
     [,1]
[1,]    0
[2,]    0
[3,]    0

$lambda$upper
         [,1]
[1,] 0.000000
[2,] 0.983750
[3,] 1.611776


$grad
              [,1]
[1,]  2.145767e-06
[2,] -9.837500e-01
[3,] -1.611776e+00

$hessian
              [,1]          [,2]          [,3]
[1,]  4.144752e-01 -7.325474e-07 -7.325635e-07
[2,] -7.325474e-07  5.011736e-03 -1.321530e-02
[3,] -7.325635e-07 -1.321530e-02  3.485172e-02
DOE
   run.order std.order ang compr alt    y
1          1         1   2     3   3 2.71
2          2         2   6     3   3 2.75
3          3         3   2     5   3 4.17
4          4         4   6     5   3 4.12
5          5         5   2     4   2 2.42
6          6         6   6     4   2 2.61
7          7         7   2     4   4 4.36
8          8         8   6     4   4 4.82
9          9         9   4     3   2 2.65
10        10        10   4     5   2 3.43
11        11        11   4     3   4 3.68
12        12        12   4     5   4 5.62
13        13        13   4     4   3 3.43
14        14        14   4     4   3 3.45
15        15        15   4     4   3 3.82
16        16        16   4     4   3 3.46
17        17        17   4     4   3 3.68

Data are stored in coded form using these coding formulas ...
x1 ~ (ang - 4)/2
x2 ~ (compr - 4)/1
x3 ~ (alt - 3)/1
#Gráficos
persp(funcao,~x1+x2,zlab = "y",col="blue",
      contours = "colors",theta = 30,phi = 30)
persp(funcao,~x1+x3,zlab = "y",col="blue",
      contours = "colors",theta = 30,phi = 30)
persp(funcao,~x2+x3,zlab = "y",col="blue",
      contours = "colors",theta = 30,phi = 30)
contour(funcao,~x1+x2,image = T)
points(3.6140,5,col="blue",lwd=3)

contour(funcao,~x1+x3,col="black")
points(3.6140,4,col="blue",lwd=3)

contour(funcao,~x2+x3,col=rainbow(10))
points(5,4,col="blue",lwd=3)

predict(funcao,newdata = data.frame(x1=0,x2=1,x3=1),
        se.fit = T,interval = "conf")
$fit
       fit     lwr      upr
1 5.707368 5.37123 6.043507

$se.fit
[1] 0.1508606

$df
[1] 10

$residual.scale
[1] 0.1823815
#Validação
DOE
   run.order std.order ang compr alt    y
1          1         1   2     3   3 2.71
2          2         2   6     3   3 2.75
3          3         3   2     5   3 4.17
4          4         4   6     5   3 4.12
5          5         5   2     4   2 2.42
6          6         6   6     4   2 2.61
7          7         7   2     4   4 4.36
8          8         8   6     4   4 4.82
9          9         9   4     3   2 2.65
10        10        10   4     5   2 3.43
11        11        11   4     3   4 3.68
12        12        12   4     5   4 5.62
13        13        13   4     4   3 3.43
14        14        14   4     4   3 3.45
15        15        15   4     4   3 3.82
16        16        16   4     4   3 3.46
17        17        17   4     4   3 3.68

Data are stored in coded form using these coding formulas ...
x1 ~ (ang - 4)/2
x2 ~ (compr - 4)/1
x3 ~ (alt - 3)/1
predict(funcao,newdata = data.frame(x1=0,x2=1,x3=1),
        se.fit = T,interval = "conf")
$fit
       fit     lwr      upr
1 5.707368 5.37123 6.043507

$se.fit
[1] 0.1508606

$df
[1] 10

$residual.scale
[1] 0.1823815
predict(funcao,newdata = data.frame(x1=0,x2=1,x3=1),
        se.fit = T,interval = "pred")
$fit
       fit      lwr      upr
1 5.707368 5.179991 6.234746

$se.fit
[1] 0.1508606

$df
[1] 10

$residual.scale
[1] 0.1823815
LS0tDQp0aXRsZTogIkV4cGVyaW1lbnRvIENhdGFwdWx0YTogUlNNIEJPWC1CRUhOS0VOIERFU0lHTjogTW9kZWxhZ2VtIGUgT3RpbWl6YcOnw6NvIHBlbGEgTGluZ3VhZ2VtIFIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KIA0KDQogDQoNCmBgYHtyfQ0KbGlicmFyeShyc20pDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShub3J0ZXN0KQ0KbGlicmFyeShSc29sbnApDQpsaWJyYXJ5KE5sY09wdGltKQ0KRE9FPC1iYmQoaz1+eDEreDIreDMsDQogICAgICAgICBibG9jayA9IEYsDQogICAgICAgICBuMD01LA0KICAgICAgICAgcmFuZG9taXplID0gRiwNCiAgICAgICAgIGNvZGluZyA9IGxpc3QoeDF+KGFuZy00KS8yLA0KICAgICAgICAgICAgICAgICAgICAgICB4Mn4oY29tcHItNCkvMSwNCiAgICAgICAgICAgICAgICAgICAgICAgeDN+KGFsdC0zKS8xKSkNCkRPRQ0KDQpET0UkeTwtKGMoMi43MSwyLjc1LDQuMTcsNC4xMiwyLjQyLDIuNjEsNC4zNiwNCiAgICAgICAgICAgNC44MiwyLjY1LDMuNDMsMy42OCw1LjYyLDMuNDMsMy40NSwNCiAgICAgICAgICAgMy44MiwzLjQ2LDMuNjgpKQ0KRE9FDQoNCmZ1bmNhbzwtIHJzbSh5fiBTTyh4MSx4Mix4MyksZGF0YSA9IERPRSkNCnN1bW1hcnkoZnVuY2FvKQ0KZnVuY2FvPC1yc20oeX4gRk8oeDEseDIseDMpKw0KICAgICAgICAgICAgIFRXSSh4Mix4MykrUFEoeDEseDMpLGRhdGEgPSBET0UpDQpzdW1tYXJ5KGZ1bmNhbykNCmBgYA0KDQpgYGB7cn0NCiM9PT09PT09PSBBbsOhbGlzZSBkb3MgUmVzw61kdW9zID09PT09PT09PT09PT09PQ0KY3VydmUoZG5vcm0oeCxtZWFuKGZ1bmNhbyRyZXNpZHVhbHMpLHNkKGZ1bmNhbyRyZXNpZHVhbHMpKSwNCiAgICAgIGZyb20gPSBtaW4oZnVuY2FvJHJlc2lkdWFscyksdG89bWF4KGZ1bmNhbyRyZXNpZHVhbHMpLA0KICAgICAgY29sPSJibHVlIixsd2Q9NCxtYWluPSJDdXJ2YSBOb3JtYWwgZG9zIFJlc8OtZHVvcyIsDQogICAgICB4bGFiID0gIk9ic2VydmHDp8O1ZXMiLHlsYWIgPSAiRGVuc2lkYWRlIikNCnFxbm9ybShmdW5jYW8kcmVzaWR1YWxzLGx3ZD0zLGNvbD0iYmx1ZSIpDQpxcWxpbmUoZnVuY2FvJHJlc2lkdWFscyxsd2Q9MykNCmxpYnJhcnkobm9ydGVzdCkNCmFkLnRlc3QoZnVuY2FvJHJlc2lkdWFscykNCnJlc2lkdWFsUGxvdChmdW5jYW8pDQpicHRlc3QoZnVuY2FvKQ0KZHVyYmluV2F0c29uVGVzdChmdW5jYW8pDQpkd3QoZnVuY2FvKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiNPdGltaXphw6fDo28NCm9iaj1mdW5jdGlvbih4KXthPC1wcmVkaWN0KGZ1bmNhbyxuZXdkYXRhID0gZGF0YS5mcmFtZSh4MT14WzFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyPXhbMl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDM9eFszXSkpDQpyZXR1cm4oLWEpfQ0KDQp4MDwtYygwLDAsMCkNCm9wdGltKHBhciA9IHgwLGZuPW9iaixsb3dlciA9IGMoLTEsLTEsLTEpLHVwcGVyID0gYygxLDEsMSksDQogICAgICBtZXRob2QgPSBjKCJMLUJGR1MtQiIpKQ0KDQpsaWJyYXJ5KE5sY09wdGltKQ0Kc29sbmwoWD14MCxvYmpmdW4gPSBvYmosbGI9YygtMSwtMSwtMSksdWI9YygxLDEsMSkpDQpET0UNCg0KI0dyw6FmaWNvcw0KcGVyc3AoZnVuY2FvLH54MSt4Mix6bGFiID0gInkiLGNvbD0iYmx1ZSIsDQogICAgICBjb250b3VycyA9ICJjb2xvcnMiLHRoZXRhID0gMzAscGhpID0gMzApDQpwZXJzcChmdW5jYW8sfngxK3gzLHpsYWIgPSAieSIsY29sPSJibHVlIiwNCiAgICAgIGNvbnRvdXJzID0gImNvbG9ycyIsdGhldGEgPSAzMCxwaGkgPSAzMCkNCnBlcnNwKGZ1bmNhbyx+eDIreDMsemxhYiA9ICJ5Iixjb2w9ImJsdWUiLA0KICAgICAgY29udG91cnMgPSAiY29sb3JzIix0aGV0YSA9IDMwLHBoaSA9IDMwKQ0KY29udG91cihmdW5jYW8sfngxK3gyLGltYWdlID0gVCkNCnBvaW50cygzLjYxNDAsNSxjb2w9ImJsdWUiLGx3ZD0zKQ0KDQpjb250b3VyKGZ1bmNhbyx+eDEreDMsY29sPSJibGFjayIpDQpwb2ludHMoMy42MTQwLDQsY29sPSJibHVlIixsd2Q9MykNCg0KY29udG91cihmdW5jYW8sfngyK3gzLGNvbD1yYWluYm93KDEwKSkNCnBvaW50cyg1LDQsY29sPSJibHVlIixsd2Q9MykNCg0KcHJlZGljdChmdW5jYW8sbmV3ZGF0YSA9IGRhdGEuZnJhbWUoeDE9MCx4Mj0xLHgzPTEpLA0KICAgICAgICBzZS5maXQgPSBULGludGVydmFsID0gImNvbmYiKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiNWYWxpZGHDp8Ojbw0KRE9FDQpwcmVkaWN0KGZ1bmNhbyxuZXdkYXRhID0gZGF0YS5mcmFtZSh4MT0wLHgyPTEseDM9MSksDQogICAgICAgIHNlLmZpdCA9IFQsaW50ZXJ2YWwgPSAiY29uZiIpDQpwcmVkaWN0KGZ1bmNhbyxuZXdkYXRhID0gZGF0YS5mcmFtZSh4MT0wLHgyPTEseDM9MSksDQogICAgICAgIHNlLmZpdCA9IFQsaW50ZXJ2YWwgPSAicHJlZCIpDQpgYGANCg0KDQo=