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.)