Tilastollinen vastepintamallinnus: kokeiden suunnittelu, regressiomallin analyysi, ja vasteen optimointi Esimerkit laskettu Matlabilla Antti Hyttinen Tampereen teknillinen yliopisto 29.12.2003
ii Ohjelmien versiotietoja: MATLAB Version 6.5.0.185000 (R13) Statistics Toolbox Version 4.0 (R13) Operating System: Darwin 6.6 Darwin Kernel Version 6.6: Power Macintosh Java VM Version: Java 1.3.1 with Apple Computer
Luku 1 Regressio 1.1 Matriisilaskentaa ja multinormaalijakauma Ei esimerkkiä. 1.2 Lineaarinen regressiomalli Ensin syötetään datamatriisi ja vastevektori. >> x1=[0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7] ; >> x2=[1,1,1,1,5,5,5,5,9,9,9,9] ; >> X=[ones(size(x1)),x1,x2]; >> y=[5.63,6.42,1.38,1.94,11.57,12.16,5.72,4.69,12.68,13.31,8.28,7.73] ; >> N=length(y); >> k=2; Parametrien estimaatit voidaan laskea suoraan kaavasta: >> C=inv(X *X) C = 0.7995-1.0417-0.0391-1.0417 2.0833 0.0000-0.0391-0.0000 0.0078 >> b=c*x *y b = 10.1378-13.3458 0.8322 1
2 LUKU 1. REGRESSIO tai QR-hajotelmaa käyttäen Matlabin kenoviivaoperaattorin kautta: >> b=x\y b = 10.1378-13.3458 0.8322 Estimoidaan parametrien keskihajonnat: >> y_hat=x*b; >> r=y-y_hat; >> SSE=r *r SSE = 9.2981 >> s2=sse/(n-k-1) s2 = 1.0331 >> se=sqrt(diag(c)*s2) se = 0.9088 1.4671 0.0898 Ennustettu arvo tasoilla x 1 =0.5, x 2 =4ja ennusteen estimoitu keskihajonta: >> xi=[ 1; 0.5; 4 ]; >> y_hat=xi *b y_hat = 6.7936 >> se_y_hat=sqrt(s2*xi *C*xi) se_y_hat = 0.3069 Mallin ja datan visualisointia esimerkiksi näin:
1.2. LINEAARINEN REGRESSIOMALLI 3 >> I3=find(X(:,2)==0.3); >> I7=find(X(:,2)==0.7); >> x2=linspace(0,10) ; >> e=ones(size(x2)); >> X03=[e, 0.3*e, x2]; >> X07=[e, 0.7*e, x2]; >> plot(x(i3,3),y(i3), bo,x(i7,3),y(i7),... gx,x2, X03*b, b-,x2, X07*b, g-- ); >> xlabel( x_2 ); >> ylabel( y, Rotation,0); >> box off y 15 10 5 0 0 2 4 6 8 10 x 2
4 LUKU 1. REGRESSIO 1.3 Hypoteesien testaaminen Luodaan datamatriisi ja vastevektori. >> x1=[0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7] ; >> x2=[1,1,1,1,5,5,5,5,9,9,9,9] ; >> X=[ones(size(x1)),x1,x2,x1.*x2,x2.ˆ2,x1.*x2.ˆ2] >> y=[5.63,6.42,1.38,1.94,11.57,12.16,5.72,4.69,12.68,13.31,8.28,7.73] ; >> N=length(y); >> k=5; Lasketaan parametrien estimaatit: >> b=x\y b = 6.2079-7.9293 3.3310-3.2930-0.2401 0.3098 Estimoidaan virheen varianssi ja parametrien keskihajonnat: >> y_hat=x*b; >> r=y-y_hat; >> SSE=r *r SSE = 1.5231 >> s2=sse/(n-k-1) s2 = 0.2538 >> C=inv(X *X); >> se=sqrt(diag(c)*s2) se = 1.0328 1.9178 0.5329 0.9895 0.0519 0.0964 Testataan faktorin x 1 x 2 2 tarpeellisuus. F- ja t -jakaumien kertymäfunktioiden arvot saadaan Statistics Toolboxin komennoilla fcdf ja tcdf.
1.3. HYPOTEESIEN TESTAAMINEN 5 >> a=[0 0 0 0 0 1] ;d=0; >> F=1/s2*(a *b-d)ˆ2/(a *C*a) F = 10.3222 >> alpha_f=1-fcdf(f,1,n-k-1) alpha_f = 0.0183 >> t=(a *b-d)/sqrt(s2*a *C*a) t = 3.2128 >> alpha_t=2*(1-tcdf(t,n-k-1)) alpha_t = 0.0183 Koko mallin käyttökelpoisuuden testaus: >> A=[zeros(k,1),eye(k)];d=zeros(k,1); >> F=(N-k-1)/(5*SSE)*(A*b-d) *inv(a*c*a )*(A*b-d) F = 143.3280 >> alpha=1-fcdf(f,5,n-k-1) alpha = 3.7212e-06 ANOVA-taulun vielä laskemattomat neliösummat: >> M=eye(N)-1/N*ones(N,N); >> SSR=y_hat *M*y_hat SSR = 181.9130 >> SST=SSE+SSR SST = 183.4361 ANOVA-taulun keskineliöt:
6 LUKU 1. REGRESSIO >> MSE=SSE/(N-k-1) MSE = 0.2538 >> MSR=SSR/k MSR = 36.3826 >> MST=SST/(N-1) MST = 16.6760 Vaihtoehtoisen kaavan käyttö F-suureen laskemisessa: >> F=MSR/MSE F = 143.3280 Determinaatiokerroin R 2 ja korjattu determinaatiokerroin R 2 A : >> R2=SSR/SST R2 = 0.9917 >> R2_A=1-MSE/MST R2_A = 0.9848 Valtaosa tuloksista saadaan myös komennolla regress. Vektorissa STATS on determinaatiokerroin R 2,kokomallin käyttökelpoisuuden F-testisuure ja merkitsevyys. >> [B,BINT,R,RINT,STATS]=regress(y,X);B,STATS B = 6.2079-7.9293 3.3310-3.2930-0.2401 0.3098 STATS = 0.9917 143.3280 0.0000
1.4. MALLIN EPÄSOPIVUUDEN TESTAUS TOISTOKOKEIN 7 1.4 Mallin epäsopivuuden testaus toistokokein Matlabilla laskut suoritetaan näin. Ensin on kerrattu tarvittavat, jo kohdan 1.2 esimerkissäkin lasketut matriisit. >> x1=[0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7] ; >> x2=[1,1,1,1,5,5,5,5,9,9,9,9] ; >> X=[ones(size(x1)),x1,x2]; >> y=[5.63,6.42,1.38,1.94,11.57,12.16,5.72,4.69,12.68,13.31,8.28,7.73] ; >> N=length(y);k=2; >> b=x\y;y_hat=x*b;r=y-y_hat;sse=r *r SSE = 9.2981 >> MSE=SSE/(N-k-1) MSE = 1.0331 Sitten syötetään matriisi T ja tarkistetaan se. >> m=6; >> I=eye(m); >> T=I([1,1,2,2,3,3,4,4,5,5,6,6],:); >> X1=X([1:2:12],:); >> norm(x-t*x1) ans = 0 Mallin II residuaali: >> R=eye(N)-T*inv(T *T)*T ; >> rii=r*y; Neliösummat: >> SSPE=rII *rii SSPE = 1.5230 >> SSLOF=SSE-SSPE SSLOF = 7.7750
8 LUKU 1. REGRESSIO Ja keskineliöt: >> MSPE=SSPE/(N-m) MSPE = 0.2538 >> MSLOF=SSLOF/(m-k-1) MSLOF = 2.5917 F-testisuure ja α: >> F=MSLOF/MSPE F = 10.2098 >> fcdf(f,m-k-1,n-m) ans = 0.9910 >> alpha=1-fcdf(f,m-k-1,n-m) alpha = 0.0090
1.5. MALLIN RIITTÄVYYS 9 1.5 Mallin riittävyys Järjestetään data uudelleen. >> N=12;k=2; >> x1=[0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7] ; >> x2=[1,1,1,1,5,5,5,5,9,9,9,9] ; >> y=[5.63,6.42,1.38,1.94,11.57,12.16,5.72,4.69,12.68,13.31,8.28,7.73] ; >> j=[12,9,3,10,4,7,2,11,8,6,1,5]; >> x1=x1(j);x2=x2(j);y=y(j); Sitten sovitetaan malli ja tarkistetaan ulkolaiset. >> X=[ones(size(x1)),x1,x2]; >> b=x\y;y_hat=x*b;r=y-y_hat;sse=r *r;mse=sse/(n-k-1); >> H=X*inv(X *X)*X ; >> e=1./sqrt(mse*(1-diag(h))).*r e = -0.6493-1.1032-0.2898-0.3668 0.3648 0.8227-0.6386-0.0063-0.2874 2.0100-1.5620 1.3741 Viimeiseksi tekstin kaltaiset kuvat saadaan näin. Normaalitodennäköisyyskuvio saadaan suoraan Statistics Toolboxin komennolla normplot. >> plot(y_hat,r) >> plot(y_hat,r, o ) >> plot(1:12,r, o )
10 LUKU 1. REGRESSIO
Luku 2 KOESUUNNITTELUT 2.1 Datan muunnokset Aluksi määrityksiä: >> x1=[0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7] ; >> x2=[1,1,1,1,5,5,5,5,9,9,9,9] ; >> y=[5.63,6.42,1.38,1.94,11.57,12.16,5.72,4.69,12.68,13.31,8.28,7.73] ; >> N=length(y);k=2; >> X=[ones(size(x1)),x1,x2]; >> D=X(:,2:3); Standardoinnin keskiarvo saadaan helposti komennolla mean ja otoshajonta komennolla std: >> p_s=std(d) p_s = 0.2089 3.4112 >> l_s=-mean(d)./p_s l_s = -2.3936-1.4658 >> L_s=[1,l_s ;zeros(k,1),diag(1./p_s)] L_s = 1.0000-2.3936-1.4658 0 4.7871 0 0 0 0.2932 Standardoidaan datamatriisi: 11
12 LUKU 2. KOESUUNNITTELUT >> X_s=X*L_s X_s = 1.0000-0.9574-1.1726 1.0000-0.9574-1.1726 1.0000 0.9574-1.1726 1.0000 0.9574-1.1726 1.0000-0.9574 0.0000 1.0000-0.9574 0.0000 1.0000 0.9574 0.0000 1.0000 0.9574 0.0000 1.0000-0.9574 1.1726 1.0000-0.9574 1.1726 1.0000 0.9574 1.1726 1.0000 0.9574 1.1726 Estimoidut parametrit ja niiden keskihajonnat: >> b_s=x_s\y b_s = 7.6258-2.7879 2.8388 >> C_s=inv(X_s *X_s) C_s = 0.0833 0.0000-0.0000 0.0000 0.0909-0.0000-0.0000-0.0000 0.0909 >> y_hat_s=x_s*b_s;r_s=y-y_hat_s;sse_s=r_s *r_s,s2_s=sse_s/(n-k-1) SSE_s = s2_s = 9.2981 1.0331 >> se_s=sqrt(diag(c_s)*s2_s) se_s = 0.2934 0.3065 0.3065 Koodattaessa komennot max ja min ovat käteviä: >> p_c=(max(d) -min(d) )/2 p_c = 0.2000 4.0000
2.1. DATAN MUUNNOKSET 13 >> l_c=-1./p_c.*(min(d) +max(d) )./2 l_c = -2.5000-1.2500 >> L_c=[1,l_c ;zeros(2,1),diag(1./p_c)] L_c = 1.0000-2.5000-1.2500 0 5.0000 0 0 0 0.2500 Koodataan datamatriisi: >> X_c=X*L_c X_c = 1.0000-1.0000-1.0000 1.0000-1.0000-1.0000 1.0000 1.0000-1.0000 1.0000 1.0000-1.0000 1.0000-1.0000 0 1.0000-1.0000 0 1.0000 1.0000 0 1.0000 1.0000 0 1.0000-1.0000 1.0000 1.0000-1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 Estimoidut parametrit ja niiden keskihajonnat: >> b_c=x_c\y b_c = 7.6258-2.6692 3.3287 >> C_c=inv(X_c *X_c) C_c = 0.0833 0.0000 0 0.0000 0.0833 0 0 0 0.1250 >> y_hat_c=x_c*b_c;r_c=y-y_hat_c;sse_c=r_c *r_c,s2_c=sse_c/(n-k-1) SSE_c = 9.2981 s2_c = 1.0331
14 LUKU 2. KOESUUNNITTELUT >> se_c=sqrt(diag(c_c)*s2_c) se_c = 0.2934 0.2934 0.3594
2.2. ORTOGONAALISUUS JA KIERTOSYMMETRISYYS 15 2.2 Ortogonaalisuus ja kiertosymmetrisyys Kerrataan vanhat määritykset: >> x1=[0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7,0.3,0.3,0.7,0.7] ; >> x2=[1,1,1,1,5,5,5,5,9,9,9,9] ; >> y=[5.63,6.42,1.38,1.94,11.57,12.16,5.72,4.69,12.68,13.31,8.28,7.73] ; >> N=length(y);k=2; >> X=[ones(size(x1)),x1,x2];D=X(:,2:3); >> p_s=std(d) ;l_s=-mean(d)./p_s;l_s=[1,l_s ;zeros(k,1),diag(1./p_s)];... X_s=X*L_s;D_s=X_s(:,2:3); >> p_c=(max(d) -min(d) )/2;l_c=-1./p_c.*(min(D) +max(d) )./2;... L_c=[1,l_c ;zeros(2,1),diag(1./p_c)];x_c=x*l_c;d_c=x_c(:,2:3); Ortogonaalisuuden tarkistus: >> X *X ans = 12.0000 6.0000 60.0000 6.0000 3.4800 30.0000 60.0000 30.0000 428.0000 >> X_s *X_s ans = 12.0000-0.0000 0.0000-0.0000 11.0000 0.0000 0.0000 0.0000 11.0000 >> X_c *X_c ans = 12.0000-0.0000 0-0.0000 12.0000 0 0 0 8.0000 Kiertosymmetrisyyden ensimmäinen ehto: >>e=ones(n,1); >> e *D ans = 6 60 >> e *D_s ans = 1.0e-14 *
16 LUKU 2. KOESUUNNITTELUT -0.1332 0.1776 >> e *D_c ans = 1.0e-14 * -0.1332 0 Kiertosymmetrisyyden toinen ehto: >> D_s *D_s ans = 11.0000 0.0000 0.0000 11.0000 >> D_c *D_c ans = 12 0 0 8
2.3. SIMPLEX-KOE 17 2.3 Simplex-koe Matlabilla Simplex-koe: >> k=3; >> W=[1,0,0,0;1,1,0,0;1,0,1,0;1,0,0,1] W = 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 1 QR-hajotelma onnistuu komennolla qr: >> [Q,R]=qr(W) Q = -0.5000 0.2887 0.4082-0.7071-0.5000-0.8660 0.0000-0.0000-0.5000 0.2887-0.8165-0.0000-0.5000 0.2887 0.4082 0.7071 R = -2.0000-0.5000-0.5000-0.5000 0-0.8660 0.2887 0.2887 0 0-0.8165 0.4082 0 0 0 0.7071 Lopullinen datamatriisi: >> X=-sqrt(k+1)*Q X = 1.0000-0.5774-0.8165 1.4142 1.0000 1.7321-0.0000 0.0000 1.0000-0.5774 1.6330 0.0000 1.0000-0.5774-0.8165-1.4142 Plackett-Burman-kokeen Hadamardin matriisin voi muodostaa suoraan käyttämällä Matlabin komentoa hadamard: >> k=9;n=24; >> H=hadamard(N); >> X=[ones(N,1),H(:,N/2+(1:k))] X = 1 1 1 1 1 1 1 1 1 1 1 1-1 1-1 1 1 1-1 -1 1 1-1 -1 1-1 1 1 1-1 1 1 1-1 -1 1-1 1 1 1 1 1-1 1-1 -1 1-1 1 1
18 LUKU 2. KOESUUNNITTELUT 1 1-1 -1 1-1 -1 1-1 1 1 1-1 -1-1 1-1 -1 1-1 1 1 1-1 -1-1 1-1 -1 1 1 1 1 1-1 -1-1 1-1 -1 1 1 1 1 1-1 -1-1 1-1 1 1-1 1 1 1-1 -1-1 1 1 1 1-1 1 1 1-1 -1-1 1-1 -1-1 -1-1 -1-1 -1-1 1-1 1-1 1-1 -1-1 1 1 1-1 1 1-1 1-1 -1-1 1 1-1 -1 1 1-1 1-1 -1-1 1-1 1-1 1 1-1 1-1 -1 1-1 1 1-1 1 1-1 1-1 1-1 1 1 1-1 1 1-1 1 1-1 -1 1 1 1-1 1 1-1 1-1 -1-1 1 1 1-1 1 1 1-1 -1-1 -1 1 1 1-1 1 1-1 1-1 -1-1 1 1 1-1 1-1 -1 1-1 -1-1 1 1 1
2.4. KAHDEN TASON KOKEET 19 2.4 Kahden tason kokeet Matlabilla kaikki mahdolliset arvot faktoreille x 1, x 2 ja x 3 saadaan Statistics Toolboxin funktiosta ff2n. >> f=2*ff2n(3)-1; f = -1-1 -1-1 -1 1-1 1-1 -1 1 1 1-1 -1 1-1 1 1 1-1 1 1 1 Sitten datamatriisissa astetetaan x 4 = x 1 x 2 ja x 5 = x 1 x 3 : >> X=[ones(8,1) f f(:,1).*f(:,2) f(:,1).*f(:,3)] X = 1-1 -1-1 1 1 1-1 -1 1 1-1 1-1 1-1 -1 1 1-1 1 1-1 -1 1 1-1 -1-1 -1 1 1-1 1-1 1 1 1 1-1 1-1 1 1 1 1 1 1
20 LUKU 2. KOESUUNNITTELUT 2.5 Toisen kertaluvun regressiomalli Ei laskettu Matlabilla. 2.6 CCD-kokeet Suunnittelun 2. kertaluvun datamatriisin luonti Matlabilla. >> k=2;f=2ˆk; >> alpha=fˆ(1/4); >> n0=4-2*k+4*sqrt(f) n0 = 8 >> N=f+2*k+n0 N = 16 >> S=sqrt(1/N*(f+2*alphaˆ2)); >> x=1/s*[2*ff2n(k)-1;alpha*eye(k);-alpha*eye(k);zeros(n0,2)]; >> X=[ones(N,1) x x.ˆ2 x(:,1).*x(:,2)] X = 1.0000-1.4142-1.4142 2.0000 2.0000 2.0000 1.0000-1.4142 1.4142 2.0000 2.0000-2.0000 1.0000 1.4142-1.4142 2.0000 2.0000-2.0000 1.0000 1.4142 1.4142 2.0000 2.0000 2.0000 1.0000 2.0000 0 4.0000 0 0 1.0000 0 2.0000 0 4.0000 0 1.0000-2.0000 0 4.0000 0 0 1.0000 0-2.0000 0 4.0000 0 1.0000 0 0 0 0 0 1.0000 0 0 0 0 0 1.0000 0 0 0 0 0 1.0000 0 0 0 0 0 1.0000 0 0 0 0 0 1.0000 0 0 0 0 0 1.0000 0 0 0 0 0 1.0000 0 0 0 0 0 Data on nyt kiertosymmetristä jaortogonaalista kuten momenttimatriisista käy ilmi. >> 1/N*X *X ans = 1.0000 0 0 1.0000 1.0000 0 0 1.0000 0.0000 0 0.0000 0.0000
2.7. OPTIMAALISET KOKEET 21 0 0.0000 1.0000 0.0000 0 0.0000 1.0000 0 0.0000 3.0000 1.0000 0.0000 1.0000 0.0000 0 1.0000 3.0000 0.0000 0 0.0000 0.0000 0.0000 0.0000 1.0000 Seuraavalla scriptillä saadaan tekstissä ollut kuva, jossa näkyvät ennusteen varianssi origontoistojen määrään ja datavektorin ensimmäisen kertaluvun osan pituuden funktiona. k=2; f=2ˆk; alpha=fˆ(1/4); NvarYhat=[]; for n0=1:8 N=f+2*k+n0; S=sqrt((f+2*alphaˆ2)/N); x=[(2*ff2n(2)-1)/s;alpha*eye(2)/s;-alpha*eye(k)/s;zeros(n0,2)]; X=[ones(N,1) x x.ˆ2 x(:,1).*x(:,2)]; C=inv(X *X); npts=21; x1=0; x2=linspace(0,1.1,npts) ; [X1,X2]=meshgrid(x1,x2); e=ones(size(x1)); XI=[e X1(:) X2(:) X1(:).ˆ2 X2(:).ˆ2 X1(:).*X2(:)] ; NvarYhat(:,n0)=N*diag(XI *C*XI); end plot(x2,nvaryhat, b-, linewidth,2) set(gca, tickdir, out, PlotBoxAspectRatio,[8 5 1],... ytick,0:9, yticklabel,[ 0 ; ; ; ; ; ; ; ; ; 9 ],... xtick,0:1, fontname, Times, fontsize,14, position,[.2.11.7.8]) box off axis([0 1.1 0 9.2]) text(0.1,9.1, {\it n}_0=1, fontname, Times, fontsize,16) text(0.1,5.1, {\it n}_0=2, fontname, Times, fontsize,16) text(0.1,3.8, {\it n}_0=3, fontname, Times, fontsize,16) text(0.1,1.7, {\it n}_0=8, fontname, Times, fontsize,16) xlabel( ({\it \xi}_1ˆ2+{\it \xi}_2ˆ2)ˆ{1/2}, fontname, Times, fontsize,18) ylabel([ {\it N} Var({\it y}) ; {\it \sigma }ˆ{2} ],... fontname, Times, fontsize,18,... rotation,0, horizontalalignment, right ); 2.7 Optimaaliset kokeet Ei laskettu Matlabilla.
22 LUKU 2. KOESUUNNITTELUT
Luku 3 VASTEEN OPTIMOINTI 3.1 Gradienttimenetelmä Matlabilla ensimmäinen askel suoritetaan seuraavasti. Ensin suunnitellaan täydellinen kahden tason koe. >> f=2*ff2n(2)-1;x1=f(:,1),x2=f(:,2) X1 = X2 = -1-1 1 1-1 1-1 1 Palautetaan arvot koodatuista, jotta pystymme suorittamaan kokeet. >> x1=(90-70)*x1/2+80,x2=(90-30)*x2/2+60 x1 = x2 = 70 70 90 90 30 90 30 90 Kokeet suoritetaan 2 kertaa(satunnaisessa järjestyksessä), ja vasteen arvot syötetään sisään. 23
24 LUKU 3. VASTEEN OPTIMOINTI >> j=[1,1,2,2,3,3,4,4]; >> kokeet=[x1(j),x2(j)] kokeet = 70 30 70 30 70 90 70 90 90 30 90 30 90 90 90 90 >> y=[49.8,48.1,65.7,69.4,57.3,52.3,73.1,77.8] y = 49.8000 48.1000 65.7000 69.4000 57.3000 52.3000 73.1000 77.8000 Sitten sovitetaan 1. kertaluvun malli. >> N=8;k=2; >> X=[ones(N,1),X1(j),X2(j)] X = 1-1 -1 1-1 -1 1-1 1 1-1 1 1 1-1 1 1-1 1 1 1 1 1 1 >> C=inv(X *X);b=X\y b = 61.6875 3.4375 9.8125 Testataan mallin epäsopivuus toistokokein. >> y_hat=x*b;r=y-y_hat; >> SSE=r *r,mse=sse/(n-k-1),df=n-k-1 SSE = 33.9363
3.1. GRADIENTTIMENETELMÄ 25 MSE = df = 6.7873 5 >> m=4;i=eye(2ˆk);t=[i(j,:)]; >> R=eye(N)-T*inv(T *T)*T ;rii=r*y; >> SSPE=rII *rii,mspe=sspe/(n-m),df=n-m SSPE = MSPE = df = 31.8350 7.9588 4 >> SSLOF=SSE-SSPE,MSLOF=SSLOF/(m-k-1),df=m-k-1 SSLOF = MSLOF = df = 2.1012 2.1012 1 >> F=MSLOF/MSPE F = 0.2640 >> alpha=1-fcdf(f,m-k-1,n-m) alpha = 0.6345 Seuraavaksi varianssianalyysi. >> M=eye(N)-1/N*ones(N); >> SSR=y_hat *M*y_hat,MSR=SSR/k,df=k SSR = 864.8125
26 LUKU 3. VASTEEN OPTIMOINTI MSR = 432.4063 df = 2 >> SST=SSE+SSR,MST=SST/(N-1),df=N-1 SST = 898.7488 MST = 128.3927 df = 7 >> F=MSR/MSE F = 63.7086 >> alpha=1-fcdf(f,k,n-k-1) alpha = 2.7705e-04 Faktorien tarpeellisuustestit. >> t1=(b(2)-0)/sqrt(mse*c(2,2)) t1 = 3.7320 >> alpha=2*(1-tcdf(t1,n-k-1)) alpha = 0.0135 >> t2=(b(3)-0)/sqrt(mse*c(3,3)) t2 = 10.6531 >> alpha=2*(1-tcdf(t2,n-k-1)) alpha = 1.2611e-04 Sitten lasketaan viettosuunta ja valitaan askelpituus.
3.1. GRADIENTTIMENETELMÄ 27 >> n=1/norm(b(2:3))*b(2:3) n = 0.3306 0.9438 >> delta=1.5/n(2) delta = 1.5894 Lasketaan suoritettavia kokeita. >> i=[1:4]; x1=80+10*i*n(1)*delta, x2=60+30*i*n(2)*delta x1 = x2 = 85.2548 90.5096 95.7643 101.0191 105.0000 150.0000 195.0000 240.0000 Viimeiseksi suunnitellaan seuraavan vaiheen kokeet. >> f=2*ff2n(2)-1;x1=[f(:,1);0;0],x2=[f(:,2);0;0] X1 = X2 = -1-1 1 1 0 0-1 1-1 1 0 0 >> x1=(105.9-85.9)*x1/2+95.9,x2=(225-165)*x2/2+195 x1 = 85.9000 85.9000 105.9000 105.9000 95.9000 95.9000 x2 = 165 225
28 LUKU 3. VASTEEN OPTIMOINTI 165 225 195 195
3.2. ÄÄRIARVOTARKASTELU 29 3.2 Ääriarvotarkastelu Suunnitellaan kokeet ja sovitetaan ensimmäisen kertaluvun malli. >> f=2*ff2n(2)-1;x1=[f(:,1);0;0];x2=[f(:,2);0;0]; >> x1=(145.9-125.9)*x1/2+135.9,x2=(218.1-171.9)*x2/2+195 x1 = 125.9000 125.9000 145.9000 145.9000 135.9000 135.9000 x2 = 171.9000 218.1000 171.9000 218.1000 195.0000 195.0000 >> y=[93.6,91.7,92.5,92.9,96.2,97.0] ; >> N=length(x1);k=2; >> X=[ones(size(X1)),X1,X2]; >> b=x\y b = 93.9833 0.0250-0.3750 Epäsopivuuden testaus toistokokein. >> y_hat=x*b;r=y-y_hat; >> SSE=r *r,mse=sse/(n-k-1),df=n-k-1 SSE = MSE = df = 22.1833 7.3944 3 >> m=5;i=eye(m);t=[i([1,2,3,4,5,5],:)]; >> R=eye(N)-T*inv(T *T)*T ;rii=r*y;
30 LUKU 3. VASTEEN OPTIMOINTI >> SSPE=rII *rii,mspe=sspe/(n-m),df=n-m SSPE = 0.3200 MSPE = 0.3200 df = 1 >> SSLOF=SSE-SSPE,MSLOF=SSLOF/(m-k-1),df=m-k-1 SSLOF = 21.8633 MSLOF = 10.9317 df = 2 >> F=MSLOF/MSPE F = 34.1615 >> alpha=1-fcdf(f,m-k-1,n-m) alpha = 0.1201 Varianssianalyysi. >> M=eye(N)-1/N*ones(N); >> SSR=y_hat *M*y_hat,MSR=SSR/k,df=k SSR = 0.5650 MSR = 0.2825 df = 2 >> SST=SSE+SSR,MST=SST/(N-1),df=N-1 SST =
3.2. ÄÄRIARVOTARKASTELU 31 MST = df = 22.7483 4.5497 5 >> F=MSR/MSE F = 0.0382 >> alpha=1-fcdf(f,k,n-k-1) alpha = 0.9630 Lisäkokeet. >> X1l=[-sqrt(2);sqrt(2);0;0];X2l=[0;0;-sqrt(2);sqrt(2)]; >> x1l=(145.9-125.9)*x1l/2+135.9,x2l=(218.1-171.9)*x2l/2+195 x1l = 121.7579 150.0421 135.9000 135.9000 x2l = 195.0000 195.0000 162.3317 227.6683 >> yl=[92.7;92.8;93.4;92.7]; Toisen asteen mallin sovitus. >> X1=[X1;X1l];X2=[X2;X2l];y=[y;yl]; >> N=length(X1);k=5; >> X=[ones(size(X1)),X1,X2,X1.ˆ2,X2.ˆ2,X1.*X2]; >> b=x\y b = 96.6000 0.0302-0.3112-1.9813
32 LUKU 3. VASTEEN OPTIMOINTI -1.8313 0.5750 Mallin epäsopivuuden testaus. >> y_hat=x*b;r=y-y_hat; >> SSE=r *r,mse=sse/(n-k-1),df=n-k-1 SSE = MSE = df = 0.4540 0.1135 4 >> m=9;i=eye(m);t=[i([1,2,3,4,5,5,6,7,8,9],:)]; >> R=eye(N)-T*inv(T *T)*T ;rii=r*y; >> SSPE=rII *rii,mspe=sspe/(n-m),df=n-m SSPE = MSPE = df = 0.3200 0.3200 1 >> SSLOF=SSE-SSPE,MSLOF=SSLOF/(m-k-1),df=m-k-1 SSLOF = MSLOF = df = 0.1340 0.0447 3 >> F=MSLOF/MSPE F = 0.1396 >> alpha=1-fcdf(f,m-k-1,n-m) alpha =
3.2. ÄÄRIARVOTARKASTELU 33 0.9247 Varianssianalyysi. >> M=eye(N)-1/N*ones(N); >> SSR=y_hat *M*y_hat,MSR=SSR/k,df=k SSR = MSR = df = 25.4510 5.0902 5 >> SST=SSE+SSR,MST=SST/(N-1),df=N-1 SST = MST = df = 25.9050 2.8783 9 >> F=MSR/MSE F = 44.8492 >> alpha=1-fcdf(f,k,n-k-1) alpha = 0.0013 Malli uuteen muotoon. >> E=[b(4),1/2*b(6);1/2*b(6),b(5)],b=b(1:3) E = b = -1.9813 0.2875 0.2875-1.8313 96.6000 0.0302-0.3112
34 LUKU 3. VASTEEN OPTIMOINTI Kriittinen piste löytyy gradientin nollakohdasta, sen laatu nähdään E:n ominaisarvoista. >> z=-1/2*inv(e)*b(2:3) z = -0.0048-0.0857 >> eig(e) ans = -2.2034-1.6091 Kun puretaan koodaus, nähdään alkuperäisten faktorien tasot. Lasketaan myös maksimivaste. >> x1=(145.9-125.9)*z(1)/2+135.9,x2=(218.1-171.9)*z(2)/2+195 x1 = x2 = 135.8517 193.0194 >> y0=[1,z ]*b+z *E*z y0 = 96.6133 Kanonista muotoa varten tarvittava Schurin hajotelma saadaan Matlabin komennolla schur. >> [Q,LAMBDA]=schur(E) Q = -0.7913-0.6114 0.6114-0.7913 LAMBDA = -2.2034 0 0-1.6091 Tekstissäollut kuva piirretään seuraavalla scriptillä(alussa on toistettu jo lasketut laskut). f=2*ff2n(2)-1; X1=[f(:,1);0;0]; X2=[f(:,2);0;0]; y=[93.6,91.7,92.5,92.9,96.2,97.0] ; X1l=[-sqrt(2);sqrt(2);0;0]; X2l=[0;0;-sqrt(2);sqrt(2)];
3.2. ÄÄRIARVOTARKASTELU 35 yl=[92.7;92.8;93.4;92.7]; X1=[X1;X1l]; X2=[X2;X2l]; y=[y;yl]; N=length(X1); k=5; X=[ones(size(X1)),X1,X2,X1.ˆ2,X2.ˆ2,X1.*X2]; b=x\y; E=[b(4),1/2*b(6);1/2*b(6),b(5)]; bb=b(1:3); z=-1/2*inv(e)*bb(2:3); y0=[1,z ]*bb+z *E*z; [Q,LAMBDA]=schur(E); [xx_1,xx_2]=meshgrid(-2.0:0.05:2.0,-2.0:0.05:2.0); XX=[ones(size(xx_1(:))) xx_1(:) xx_2(:) xx_1(:).ˆ2 xx_2(:).ˆ2 xx_1(:).*xx_2(:)]; Y=reshape(XX*b,size(xx_1)); clf [C,H]=contour(xx_1,xx_2,Y,[78:3:96], b ); set(gca, PlotBoxAspectRatio,[1,1,1], XTick,[-2,-1,0,1,2], YTick,[-2,-1,0,1,2],... tickdir, out, fontname, Times, fontsize,16, linewidth,1); set(h, LineWidth,2); xlabel( {\it X}_1, fontname, Times, fontsize,20); ylabel( {\it X}_2, Rotation,0, fontname, Times, fontsize,20); hold on;plot(z(1),z(2), rx, markersize,12); hold on;plot(x1,x2, ko, markerfacecolor, k, markersize,12); q1=10*q(:,1);q2=10*q(:,2); q1x=[z(1)+q1(1),z(1)-q1(1)];q1y=[z(2)+q1(2),z(2)-q1(2)]; q2x=[z(1)+q2(1),z(1)-q2(1)];q2y=[z(2)+q2(2),z(2)-q2(2)]; hold on;plot(q1x,q1y, r--,q2x,q2y, r--, linewidth,2); box off HL=clabel(C,H, manual ); for i=1:length(hl),set(hl(i), fontsize,14, fontname, times );end
36 LUKU 3. VASTEEN OPTIMOINTI 3.3 Harjuanalyysi Matlabilla laskut menevät seuraavasti. >> b_breve=[0.93;0.38]; >> E=-1*[0.96,0.21;0.21,0.04]; >> d0=[0;0]; E:n kääntyvyys ja kriittinen piste. >> det(e) ans = -0.0057 >> z=-1/2*inv(e)*b_breve z = 3.7368-14.8684 Schurin hajotelma ja vektori p. >> [Q,LAMBDA]=schur(E) Q = -0.9772 0.2125-0.2125-0.9772 LAMBDA = -1.0057 0 0 0.0057 >> p=q *(-1/2*b_breve-E*d0) p = 0.4948 0.0868 Kuvan piirtäminen sujuu pääpiirteittäin näin. >> mu=linspace(0.01,0.5); >> r_inv=1./sqrt((lambda(1,1)-mu).ˆ(-2)*p(1)ˆ2+... (LAMBDA(2,2)-mu).ˆ(-2)*p(2)ˆ2); >> plot(mu,r_inv) Lasketaan vielä tarkemmat µ i :n arvot Matlabin komennolla fzero.ensin määritellään funktio, jolla on nollakohta paikassa, missä d i d 0 = i.
3.3. HARJUANALYYSI 37 >> f=inline(... 1./sqrt((lambda1-mu).ˆ(-2)*p1ˆ2+(lambda2-mu).ˆ(-2)*p2ˆ2)-r,... mu, lambda1, lambda2, p1, p2, r_inv ) f = Inline function: f(mu,lambda1,lambda2,p1,p2,r_inv) = 1./sqrt((lambda1-mu).ˆ(-2)*p1ˆ2 +(lambda2-mu).ˆ(-2)*p2ˆ2)-r_inv Laitetaan turha varoitus pois päältä, jonka jälkeen saadaan tarkemmat µ i :n arvot. fzero:n parametrit ovat järjestyksessä funktio, lähellä nollakohtaa oleva piste, tarkkuusehdot sisältävä matriisi (tässä tyhjä, eli käytetään oletuksia) ja loput f:n parametreista. >> warning off MATLAB:fzero:UndeterminedSyntax >> mu1=fzero(f,0.28,[],lambda(1,1),lambda(2,2),p(1),p(2),2) mu1 = 0.2783 >> mu2=fzero(f,0.10,[],lambda(1,1),lambda(2,2),p(1),p(2),1) mu2 = 0.1027 Lasketaan pisteet. >> d1=d0+inv(e-mu1*eye(2))*(-1/2*b_breve-e*d0) d1 = 0.3088 0.3932 >> d2=d0+inv(e-mu2*eye(2))*(-1/2*b_breve-e*d0) d2 = 0.2460 0.9693 Tarkastetaan vielä, että pisteet todella ovat halutulla etäisyydellä d 0 :sta. >> norm(d1-d0) ans = 0.5000 >> norm(d2-d0) ans = 1.0000 Lopulta tekstin mukavat kuvat tulostuvat suunnilleen seuraavalla scriptillä:
38 LUKU 3. VASTEEN OPTIMOINTI [X,Y]=meshgrid(-2:0.05:2,-2:0.05:2);%lasketaan vastepinnan arvoja Z=zeros(size(X)); for i=1:size(x,1), for j=1:size(x,2), d=[x(i,j);y(i,j)]; Z(i,j)=b_breve *d+d *E*d; end end r1=0.5; %lasketaan ympyrät x11=[-r1:0.01:r1] ;x12=[r1:-0.01:-r1] ;x1=[x11;x12]; y1=[sqrt(r1ˆ2-x11.ˆ2);-sqrt(r1ˆ2-x12.ˆ2)]; r2=1; x21=[-r2:0.01:r2] ;x22=[r2:-0.01:-r2] ;x2=[x21;x22]; y2=[sqrt(r2ˆ2-x21.ˆ2);-sqrt(r2ˆ2-x22.ˆ2)]; figure;[c,h]=contour(x,y,z);box off;%tasa-arvokäyräkuva set(gca, PlotBoxAspectRatio,[1,1,1], XTick,[-2:0.5:2], YTick,[-2:0.5:2],... tickdir, out, fontname, Times, fontsize,14, linewidth,1); set(h, LineWidth,2); hold on;plot(x1,y1, k, linewidth,2); hold on;plot(x2,y2, k, linewidth,2); xlabel( X_1, fontname, Times, fontsize,16); ylabel( X_2, Rotation,0, fontname, Times, fontsize,16); plot( [d0(1),d1(1),d2(1)],[d0(1),d1(2),d2(2)], ko,... markerfacecolor, k, markersize,9); figure;surfc(x,y,z);shading interp;hold on; %3dkuva plot3([d0(1),d1(1),d2(1)],[d0(1),d1(2),d2(2)],... [0,d1 *b_breve+d1 *E*d1,d2 *b_breve+d2 *E*d2], ko,... markerfacecolor, k, markersize,9); set(gca, PlotBoxAspectRatio,[1,1,1], XTick,[-2:1:2], YTick,[-2:1:2],... tickdir, out, fontname, Times, fontsize,14, linewidth,1); xlabel( X_1, fontname, Times, fontsize,16); ylabel( X_2, Rotation,0, fontname, Times, fontsize,16);