Några produktionstekniker på en Ericsson-fabrik undersökte sambandet mellan mätresultat och några försöksvariabler i sambande med PCB-tillverkning (Printed Circuit Boards, mönsterkort). De första korttyperna var enkelsidiga men då mer kapacitet skulle få plats på samma yta, övergick man till dubbelsidiga basmaterial. För att kunna överföra en signal via baksidan mellan kortets komponenter behövdes kopparpläterade hål.
Pläteringen genomfördes elektrolytiskt i långa automatiserade processer. Mönsterkortets hela yta, inklusive hålen, pläterades med 30-35 mm/1000.
Man använde en försöksplan (DoE, Design of Experiment) och s.k RSM (Response Surface Method) och nedan presenteras en dylik. Med något datorprogram beräknas ett matematiskt samband, en ‘modell’. Denna kan i grafisk form ofta anges som ett ‘fisknät’ i 3D och man söker maximum (eller minimum) som då visar på bästa inställning av försöksvariablerna.


Försöksplan. Den valda försöksplanen består av två delar. En del består av nivåerna (-1, 1) och en del är en stjärnformation med fyra mätpunkter på (-1.216, 1.216) samt en centrumpunkt, totalt 17 mätpunkter. Nedanstående tabell visar de tre försöksvariablerna (Temperatur i pläteringsbad (Temp), Amper per kvadratdecimeter (A/dm2), Koncentration i pläteringdbad (Conc) samt kodade och verkliga nivåer. Responsvariabeln (y) är viktökningen av koppar på provbitarna.


Koder, grafer och övrig programmering kan utföras på flera olika sätt men har här hållits till ett minimum för tydlighetens skull.



 En responsyta från https://ovn.ing-stat.se/ [41b]

Sliderna till vänster (visas inte här) kan användas för att illustrera hur ytan förändras med olika inställningar. Modellen visar resultatet från den slutgiltliga analysen längre ned.





































Skapa försöksplanen. CCD-kommandot skapar en försöksplan där ‘3’ anger antal X-variabler. ‘n0’ anger här att planen skall innehålla 0 punkter i x1 = x2 = x3 = 0 för ‘box’-planen men 3 i x1 = x2 = x3 = 0 för ‘stjärn’-planen. ‘randomize = FALSE’ anger att utskriften sker i ‘run order’. (I verkligheten skall mätningar göras i slumpmässig ordning.) Längst till höger anges ‘block’ som anger att mätning i block 1 kan med fördel göras och analyseras först. (Om inget intressant visas kanske resten av mätningarna inte utförs.):


library(rsm)                                                            # Funktioner för RSM
                                                                        # 'Central Composite Design' CCD
minPlan <- ccd (3, n0 = c(0, 3), alpha = 1.216, coding = list(x1 ~ T, x2 ~ A, x3 ~ C), randomize = FALSE)

T <- minPlan$x1                                                         # 'Lyfter ut' försöksvariablerna
A <- minPlan$x2                                                         # ur försöksplanen.
C <- minPlan$x3                                                        

minPlan                                                                 # Skriver ut försöksplanen.
##    run.order std.order      T      A      C Block
## 1          1         1 -1.000 -1.000 -1.000     1
## 2          2         2  1.000 -1.000 -1.000     1
## 3          3         3 -1.000  1.000 -1.000     1
## 4          4         4  1.000  1.000 -1.000     1
## 5          5         5 -1.000 -1.000  1.000     1
## 6          6         6  1.000 -1.000  1.000     1
## 7          7         7 -1.000  1.000  1.000     1
## 8          8         8  1.000  1.000  1.000     1
## 9          1         1 -1.216  0.000  0.000     2
## 10         2         2  1.216  0.000  0.000     2
## 11         3         3  0.000 -1.216  0.000     2
## 12         4         4  0.000  1.216  0.000     2
## 13         5         5  0.000  0.000 -1.216     2
## 14         6         6  0.000  0.000  1.216     2
## 15         7         7  0.000  0.000  0.000     2
## 16         8         8  0.000  0.000  0.000     2
## 17         9         9  0.000  0.000  0.000     2
## 
## Data are stored in coded form using these coding formulas ...
## x1 ~ T
## x2 ~ A
## x3 ~ C


Analys av data. Mätvärdena (y) lagras tillsammans med x-variablerna i ‘minadata’-tabellen. Analysen av data skapar en mer eller mindre standardutskrift, likt den som finns vid s.k. regressionsanlys.
Varje rad ‘Intercept’, ‘x1’, osv är en term i den linjära modellen. Om P-värdet (‘Pr(>|t[)’) längst till höger är lågt, säg, < 0.05, anses termen platsa i den modell som bäst förklarar sambandet (termen är ‘signifikant’):


# Mätningar från processen ('viktökning').

y <- c(0.3045, 0.3566, 0.2844, 0.5563, 0.3663, 0.3536, 0.9688, 1.0831, 0.5815, 
       0.7080, 0.2799, 0.8732, 0.3012, 0.7500, 0.6954, 0.4874, 0.4806)

minadata <- cbind(minPlan, y)                                            # Lägger 'y' i 'x'-tabellen.                                     
# 
library(rsm)                                                             # Anropar funktioner för 'rsm'.
analys <- rsm(y ~ SO(x1, x2, x3), data = minadata)                       # SO = 'Standard Order'.
summary(analys)                                                          # En sammanfattande tabell.
## 
## Call:
## rsm(formula = y ~ SO(x1, x2, x3), data = minadata)
## 
##              Estimate Std. Error t value  Pr(>|t|)    
## (Intercept)  0.577078   0.038177 15.1157 1.333e-06 ***
## x1           0.052880   0.023930  2.2097 0.0628208 .  
## x2           0.203796   0.023930  8.5162 6.102e-05 ***
## x3           0.165710   0.023930  6.9247 0.0002263 ***
## x1:x2        0.043350   0.028006  1.5479 0.1655818    
## x1:x3       -0.027800   0.028006 -0.9926 0.3539550    
## x2:x3        0.144050   0.028006  5.1435 0.0013336 ** 
## x1^2         0.030689   0.035323  0.8688 0.4137517    
## x2^2        -0.015434   0.035323 -0.4369 0.6753159    
## x3^2        -0.049891   0.035323 -1.4124 0.2007076    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Multiple R-squared:  0.9576, Adjusted R-squared:  0.903 
## F-statistic: 17.55 on 9 and 7 DF,  p-value: 0.0005218
## 
## Analysis of Variance Table
## 
## Response: y
##                 Df  Sum Sq  Mean Sq F value    Pr(>F)
## FO(x1, x2, x3)   3 0.78661 0.262205 41.7865 7.755e-05
## TWI(x1, x2, x3)  3 0.18722 0.062407  9.9455  0.006428
## PQ(x1, x2, x3)   3 0.01717 0.005723  0.9121  0.482394
## Residuals        7 0.04392 0.006275                  
## Lack of fit      5 0.01411 0.002822  0.1893  0.941537
## Pure error       2 0.02982 0.014908                  
## 
## Stationary point of response surface:
##          x1          x2          x3 
##  0.01933272 -2.50205401 -1.95673828 
## 
## Eigenanalysis:
## eigen() decomposition
## $values
## [1]  0.04704542  0.02923440 -0.11091643
## 
## $vectors
##         [,1]       [,2]       [,3]
## x1 0.5557502  0.8137983  0.1699236
## x2 0.7034828 -0.3514274 -0.6177465
## x3 0.4430053 -0.4628511  0.7677989

Ytterligare kommentar om utskriften. Om en term är ‘icke-signifikant’ bör analysen göras om med en enklare modell. Man börjar med att eliminera icke-signifikanta andragrads- och samspelstermer (x1:x2). Om en ‘x’-term är icke-signifikant medan motsvarande kvadratterm är signifikant, skall ‘x’-termen behållas i modellen. Nedan utesluts ‘x1’-termen:

# Analys utan T (x1). 

analys <- rsm(y ~ SO(x2, x3), data = minadata)                           # SO = 'Standard Order'.
summary(analys)                                                          # En sammanfattande tabell.
## 
## Call:
## rsm(formula = y ~ SO(x2, x3), data = minadata)
## 
##              Estimate Std. Error t value  Pr(>|t|)    
## (Intercept)  0.590922   0.041866 14.1147 2.158e-08 ***
## x2           0.203796   0.028878  7.0571 2.107e-05 ***
## x3           0.165710   0.028878  5.7382 0.0001306 ***
## x2:x3        0.144050   0.033797  4.2622 0.0013380 ** 
## x2^2        -0.010829   0.042144 -0.2570 0.8019531    
## x3^2        -0.045286   0.042144 -1.0746 0.3055789    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Multiple R-squared:  0.9029, Adjusted R-squared:  0.8587 
## F-statistic: 20.45 on 5 and 11 DF,  p-value: 3.119e-05
## 
## Analysis of Variance Table
## 
## Response: y
##             Df  Sum Sq Mean Sq F value    Pr(>F)
## FO(x2, x3)   2 0.75597 0.37799 41.3648 7.627e-06
## TWI(x2, x3)  1 0.16600 0.16600 18.1665  0.001338
## PQ(x2, x3)   2 0.01243 0.00622  0.6803  0.526554
## Residuals   11 0.10052 0.00914                  
## Lack of fit  3 0.00798 0.00266  0.2301  0.872949
## Pure error   8 0.09253 0.01157                  
## 
## Stationary point of response surface:
##        x2        x3 
## -2.252888 -1.753490 
## 
## Eigenanalysis:
## eigen() decomposition
## $values
## [1]  0.04599906 -0.10211470
## 
## $vectors
##          [,1]       [,2]
## x2 -0.7850600 -0.6194197
## x3 -0.6194197  0.7850600

Det framgår ovan att modellen bör förenklas ytterligare. Nedan skapas en modell för ‘x2’ och ‘x3’ samt samspelstermen ’x1*x2’:

# Analys endast med x2 + x3 + x2*x3. 

analys <- rsm(y ~ x2 + x3 + x2*x3, data = minadata)                       
summary(analys)                                                          # En sammanfattande tabell.
## 
## Call:
## rsm(formula = y ~ x2 + x3 + x2 * x3, data = minadata)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.164388 -0.052049 -0.006318  0.027303  0.153247 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.55475    0.02261  24.539 2.84e-12 ***
## x2           0.20380    0.02816   7.237 6.58e-06 ***
## x3           0.16571    0.02816   5.885 5.37e-05 ***
## x2:x3        0.14405    0.03296   4.371 0.000757 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.09321 on 13 degrees of freedom
## Multiple R-squared:  0.8909, Adjusted R-squared:  0.8657 
## F-statistic: 35.37 on 3 and 13 DF,  p-value: 1.614e-06

Modellen förklarar cirka 90% av variationen i ‘y’ (‘R-squared’). Resterande 10% består av försöksvariabler - kända såväl som okända - som inte ingår i modellen samt mätfel.



Nivådiagram. Diagrammet avbildar responsytan som en karta. Modellen är ett vridet plan och innehåller inga andragradstermer. Det framgår att högsta nivån hittas då både ‘x2’ och ‘x3’ är på högsta nivån:

contour(analys, ~ x2 + x3)                        # Skapar ett nivådiagram.

Responsyta. Diagrammet avbildar responsytan som ett 3D-diagram. Generellt gäller att ett 3D-diagram är svårare att tolka. (Samma diagram som överst i dokumentet):


x <- seq(-1.5, 1.5, length = 20)
y <- seq(-1.5, 1.5, length = 20)

b0 <- analys$coefficients[1]             # Plockar ut modellens koefficienter.
b1 <- analys$coefficients[2]
b2 <- analys$coefficients[3]
b3 <- analys$coefficients[4]

z <- outer(x, y, function(x, y){ b0 + b1*x + b2*y + b3*x*y})

persp(x, y, z,
main  = 'Viktökning f(A/dm2, Konc)',
zlab  = 'Viktökning', ylab = 'A/dm2', xlab = 'Konc',
theta = 30, phi = 40, ticktype = "detailed",
col   = 'yellow', shade = 0.5, r = 20)

Fortsättning. Det finns ingen dokumenterat fortsättning som anger hur produktionsteknikerna använde resultatet. En ökad viktökning är eftersträvansvärd eftersom det minskar tidsåtgången. I så fall behöver både A/dm2 och koncentration ökas. Det framgår av analysen att temperaturen inte har någon signifikant påverkan och en minskning skulle innebära en besparing.
Den verkliga processen består av många platskrävande bad, vissa av dem dubblerade för ökande produktionsmängd så effektivare parameterinställningar vore välkomna.


Avslutningsvis
Ovanstående text avser inte att ge en uttömmande diskussion om analys av data från en CCD-plan. Det finns många kommandon som kan ge mer information och flera sätt att automatisera en analys. Även graferna kan göras mer utförliga med t.ex. textinformation, färger m.m. Men här har framställningen poängterat enkelhet.

(Analyserna har gjorts med datorprogrammet ‘R’ och med det grafiska gränssnittet ‘R-studio’ och bägge är gratis tillgängliga på nätet. Se https://www.indstat.se och knappen [Statistikprogram - R] för installation.)

(Se https://www.indstat.se och https://ovn.ing-stat.se för många andra simuleringsövningar.)