From 4f530ee048bec4ee6996d105f92d2163b1b63150 Mon Sep 17 00:00:00 2001
From: LMGV <57717914+LMGV@users.noreply.github.com>
Date: Tue, 22 Feb 2022 15:47:24 +0100
Subject: [PATCH 1/3] Delete README.md
---
QID-1208-MVAdiscbh/README.md | 285 -----------------------------------
1 file changed, 285 deletions(-)
delete mode 100644 QID-1208-MVAdiscbh/README.md
diff --git a/QID-1208-MVAdiscbh/README.md b/QID-1208-MVAdiscbh/README.md
deleted file mode 100644
index fa39303..0000000
--- a/QID-1208-MVAdiscbh/README.md
+++ /dev/null
@@ -1,285 +0,0 @@
-
-[](http://quantlet.de/)
-
-## [](http://quantlet.de/) **MVAdiscbh** [](http://quantlet.de/)
-
-```yaml
-
-Name of QuantLet : MVAdiscbh
-
-Published in : Applied Multivariate Statistical Analysis
-
-Description : 'Demonstrates maximum likelihood discrimination rule (ML rule) for the Boston housing
-data.'
-
-Keywords : 'apparent-error-rate, discrimination, cluster-analysis, estimation,
-discriminant-analysis, euclidean-distance-matrix, maximum-likelihood, plot, graphical
-representation, financial, sas'
-
-See also : MVAaer, MVAaper, MVAaerbh, MVAdisfbank, MVAdisnorm
-
-Author : Zografia Anastasiadou
-
-Author[SAS] : Svetlana Bykovskaya
-
-Submitted : Thu, August 04 2011 by Awdesch Melzer
-
-Submitted[SAS] : Wen, April 6 2016 by Svetlana Bykovskaya
-
-Datafile : bostonh.dat
-
-Example : Discrimination scores for the two clusters created from the Boston housing data.
-
-```
-
-![Picture1](MVAdiscbh.png)
-
-![Picture2](MVAdiscbh_sas.png)
-
-
-### R Code:
-```r
-
-# clear all variables
-rm(list = ls(all = TRUE))
-graphics.off()
-
-# load data
-data = read.table("bostonh.dat")
-
-# transform data
-xt = data
-xt[, 1] = log(data[, 1])
-xt[, 2] = data[, 2]/10
-xt[, 3] = log(data[, 3])
-xt[, 5] = log(data[, 5])
-xt[, 6] = log(data[, 6])
-xt[, 7] = (data[, 7]^(2.5))/10000
-xt[, 8] = log(data[, 8])
-xt[, 9] = log(data[, 9])
-xt[, 10] = log(data[, 10])
-xt[, 11] = exp(0.4 * data[, 11])/1000
-xt[, 12] = data[, 12]/100
-xt[, 13] = sqrt(data[, 13])
-xt[, 14] = log(data[, 14])
-data = xt[, -4]
-
-da = scale(data) # standardize variables
-d = dist(da, "euclidean", p = 2) # euclidean distance matrix
-w = hclust(d, method = "ward.D") # cluster analysis with ward algorithm
-tree = cutree(w, 2) # define the clusters, tree=1 if cluster=1
-
-# the following two lines under comments are for price of Boston houses
-# tree=(xt[,14]>median(xt[,14]))+1
-# da=da[,1:12]
-
-t1 = subset(da, tree == 1)
-t2 = subset(da, tree == 2)
-
-m1 = colMeans(t1) # mean of first cluster
-m2 = colMeans(t2) # mean of second cluster
-m = (m1 + m2)/2 # mean of both clusters
-s = ((nrow(t1) - 1) * cov(t1) + (nrow(t2) - 1) * cov(t2))/(nrow(xt) - 2) # common variance matrix
-alpha = solve(s) %*% (m1 - m2) # alpha for the discrimination rule
-
-# APER for clusters of Boston houses
-mis1 = sum((t1 - m) %*% alpha < 0) # misclassified 1
-mis2 = sum((t2 - m) %*% alpha > 0) # misclassified 2
-corr1 = sum((t1 - m) %*% alpha > 0) # correct 1
-corr2 = sum((t2 - m) %*% alpha < 0) # correct 2
-aper = (mis1 + mis2)/nrow(xt) # APER (apparent error rate)
-alph = (da - matrix(m, nrow(da), ncol(da), byrow = T)) %*% alpha
-set.seed(1)
-
-# discrimination scores
-p = cbind(alph, tree + 0.05 * rnorm(NROW(tree)))
-tree[tree == 1] = 16
-tree[tree == 2] = 17
-tr = tree
-tr[tr == 16] = "red"
-tr[tr == 17] = "black"
-
-# plot of discrimination scores
-plot(p[, 1], p[, 2], pch = tree, col = tr, xaxt = "n", yaxt = "n", xlab = "", ylab = "",
- bty = "n")
-abline(v = 0, lwd = 3)
-title(paste("Discrimination scores"))
-
-```
-
-### SAS Code:
-```sas
-* Import the data;
-data bostonh;
- infile '/folders/myfolders/data/bostonh.dat';
- input temp1-temp14;
-run;
-
-proc iml;
- * Read data into a matrix;
- use bostonh;
- read all var _ALL_ into datax;
- close bostonh;
-
- xt = datax;
- xt[, 1] = log(datax[, 1]);
- xt[, 2] = datax[, 2]/10;
- xt[, 3] = log(datax[, 3]);
- xt[, 5] = log(datax[, 5]);
- xt[, 6] = log(datax[, 6]);
- xt[, 7] = (datax[, 7] ## (2.5))/10000;
- xt[, 8] = log(datax[, 8]);
- xt[, 9] = log(datax[, 9]);
- xt[, 10] = log(datax[, 10]);
- xt[, 11] = exp(0.4 * datax[, 11])/1000;
- xt[, 12] = datax[, 12]/100;
- xt[, 13] = sqrt(datax[, 13]);
- xt[, 14] = log(datax[, 14]);
- datax = xt[,1:3] || xt[,5:14];
-
- create dat from datax[colname={"t1" "t2" "t3" "t4" "t5" "t6" "t7" "t8" "t9" "t10" "t11" "t12" "t13"}];
- append from datax;
- close dat;
-
- create dat2 from xt[colname={"t1" "t2" "t3" "t4" "t5" "t6" "t7" "t8" "t9" "t10" "t11" "t12" "t13" "t14"}];
- append from xt;
- close dat2;
-
-quit;
-
-* standardize the data matrix;
-proc standard data = dat mean = 0 std = 1 out = ydat;
- var t1-t13;
-run;
-
-* euclidean distance matrix;
-proc distance data = ydat out = dist method = euclid nostd;
- var interval (t1--t13);
-run;
-
-data newdist;
- id + 1;
- set dist;
-run;
-
-* cluster analysis with ward algorithm;
-ods graphics on;
-proc cluster data = newdist(type = distance)
- method = ward
- plots(only) = (Pseudo Dendrogram(vertical))
- print = 0
- outtree = stat
- noprint;
- id id;
- title 'Ward Dendrogram for standardized data';
-run;
-ods graphics off;
-
-* define the clusters;
-proc tree data = stat noprint out = sol nclusters = 2;
- id id;
-run;
-
-data t3;
- set sol;
- if CLUSTER = 1;
-run;
-
-data t4;
- set sol;
- if CLUSTER = 2;
-run;
-
-data ydat2;
- id + 1;
- set ydat;
-run;
-
-proc iml;
- * all data;
- use ydat2;
- read all var _ALL_ into main;
- close ydat2;
-
- * cluster 1;
- use t3;
- read all var _ALL_ into r3;
- close t3;
-
- * cluster 2;
- use t4;
- read all var _ALL_ into r4;
- close t4;
-
- * original data;
- use dat2;
- read all var _ALL_ into z;
- close dat2;
-
- idd1 = r3[,1];
- idd2 = r4[,1];
-
- main = main[,2:14];
- d1 = main[idd1,];
- d2 = main[idd2,];
-
- m1 = (d1[:,]); * mean of first cluster;
- m2 = (d2[:,]); * mean of second cluster;
- m = (m1 + m2) / 2; * mean of both clusters;
- s = ((nrow(d1) - 1) * cov(d1) + (nrow(d2) - 1) * cov(d2))/(nrow(z) - 2); * common variance matrix;
- alpha = inv(s) * (m1 - m2)`; * alpha for the discrimination rule;
-
- * APER for clusters of Boston houses;
- mis1 = sum((d1 - m) * alpha < 0); * misclassified 1;
- mis2 = sum((d2 - m) * alpha > 0); * misclassified 2;
- corr1 = sum((d1 - m) * alpha > 0); * correct 1;
- corr2 = sum((d2 - m) * alpha < 0); * correct 2;
- aper = (mis1 + mis2)/nrow(z); * APER (apparent error rate);
- alph = (main - repeat(m, nrow(main), 1)) * alpha;
-
- n = nrow(z);
- z = (1:n)` || z;
-
- * marker for cluster 1;
- do i = 1 to nrow(idd1);
- z[idd1[i],1] = 1;
- end;
-
- * marker for cluster 2;
- do i = 1 to nrow(idd2);
- z[idd2[i],1] = 2;
- end;
-
- * discrimination scores;
- t = 0.05 * randnormal(n, 0, 1);
- do i = 1 to n;
- t[i] = z[i,1] + t[i];
- end;
-
- p = z[,1] || alph || t;
-
- id = p[,1];
- x1 = p[,2];
- x2 = p[,3];
-
- create plot var {"x1" "x2" "id"};
- append;
- close plot;
-quit;
-
-proc sgplot data = plot
- noautolegend;
- title 'Discrimination scores';
- scatter x = x1 y = x2 / colorresponse = id colormodel = (red blue)
- markerattrs = (symbol = circlefilled);
- refline 0 / axis = x lineattrs = (color = black thickness = 2);
- xaxis display = none;
- yaxis display = none;
-run;
-
-
-
-
-
-
-```
From a61fe344829fdad7fbeb701219a7586131140d23 Mon Sep 17 00:00:00 2001
From: LMGV <57717914+LMGV@users.noreply.github.com>
Date: Tue, 22 Feb 2022 15:51:37 +0100
Subject: [PATCH 2/3] Update Metainfo.txt
---
QID-1208-MVAdiscbh/Metainfo.txt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/QID-1208-MVAdiscbh/Metainfo.txt b/QID-1208-MVAdiscbh/Metainfo.txt
index c7ac94c..4335a82 100644
--- a/QID-1208-MVAdiscbh/Metainfo.txt
+++ b/QID-1208-MVAdiscbh/Metainfo.txt
@@ -10,9 +10,11 @@ See also: MVAaer, MVAaper, MVAaerbh, MVAdisfbank, MVAdisnorm
Author: Zografia Anastasiadou
Author[SAS]: Svetlana Bykovskaya
+Author[Python]: 'Matthias Fengler, Liudmila Gorkun-Voevoda'
Submitted: Thu, August 04 2011 by Awdesch Melzer
Submitted[SAS]: Wen, April 6 2016 by Svetlana Bykovskaya
+Submitted[Python]: Tue, February 22 2022 by Liudmila Gorkun-Voevoda
Datafile: bostonh.dat
From f316928724b957cfdd308b41fcee257d9c86a8df Mon Sep 17 00:00:00 2001
From: LMGV <57717914+LMGV@users.noreply.github.com>
Date: Tue, 22 Feb 2022 15:52:11 +0100
Subject: [PATCH 3/3] Python code
---
QID-1208-MVAdiscbh/MVAdiscbh.py | 70 ++++++++++++++++++++++++
QID-1208-MVAdiscbh/MVAdiscbh_python.png | Bin 0 -> 21948 bytes
2 files changed, 70 insertions(+)
create mode 100644 QID-1208-MVAdiscbh/MVAdiscbh.py
create mode 100644 QID-1208-MVAdiscbh/MVAdiscbh_python.png
diff --git a/QID-1208-MVAdiscbh/MVAdiscbh.py b/QID-1208-MVAdiscbh/MVAdiscbh.py
new file mode 100644
index 0000000..ff45f9a
--- /dev/null
+++ b/QID-1208-MVAdiscbh/MVAdiscbh.py
@@ -0,0 +1,70 @@
+import pandas as pd
+import numpy as np
+from scipy.cluster import hierarchy
+import random
+import matplotlib.pyplot as plt
+
+data = pd.read_csv("bostonh.dat", sep = "\s+", header=None)
+
+# transform data
+
+xt = data
+for i in [0, 2, 4, 5, 7, 8, 9, 13]:
+ xt.iloc[:, i] = np.log(data.iloc[:, i])
+
+xt.iloc[:, 1] = data.iloc[:, 1]/10
+xt.iloc[:, 6] = (data.iloc[:, 6]**(2.5))/10000
+xt.iloc[:, 10] = np.exp(0.4 * data.iloc[:, 10])/1000
+xt.iloc[:, 11] = data.iloc[:, 11]/100
+xt.iloc[:, 12] = np.sqrt(data.iloc[:, 12])
+data = xt.drop(3, axis = 1)
+
+da = (data - np.mean(data))/np.std(data, ddof = 1)
+d = np.zeros([len(da),len(da)])
+
+
+for i in range(0, len(da)):
+ for j in range(0, len(da)):
+ d[i, j] = np.linalg.norm(da.iloc[i, :] - da.iloc[j, :])
+
+ddd = d[1:, :-1][:, 0]
+for i in range(1, len(da)-1):
+ ddd = np.concatenate((ddd, d[1:, :-1][i:, i]))
+
+w = hierarchy.linkage(ddd, 'ward')
+tree = hierarchy.cut_tree(w, n_clusters = 2)
+
+da["tree"] = tree
+
+t1 = da[da["tree"] == 0].iloc[:, :-1]
+t2 = da[da["tree"] == 1].iloc[:, :-1]
+
+m1 = t1.mean() # mean of first cluster
+m2 = t2.mean() # mean of second cluster
+m = (m1 + m2)/2
+s = ((len(t1) - 1) * t1.cov() + (len(t2) - 1) * t2.cov())/(len(xt) - 2)
+alpha = np.linalg.inv(s) @ (m1 - m2)
+
+mis1 = ((t1 - m) @ alpha < 0).sum()
+mis2 = ((t2 - m) @ alpha > 0).sum()
+
+corr1 = ((t1 - m) @ alpha > 0).sum()
+corr2 = ((t2 - m) @ alpha < 0).sum()
+
+aper = (mis1 + mis2)/len(xt)
+alph = (da.iloc[:, :-1] - np.tile(np.array(m), (len(da), 1))) @ alpha
+
+random.seed(1)
+
+p = tree.flatten() + (0.05*np.random.normal(size = len(tree)))
+
+dav = pd.DataFrame(data = {"tree": tree.flatten(), "p": p, "alph": alph})
+
+fig, ax = plt.subplots(figsize = (10, 10))
+ax.scatter(dav[dav["tree"] == 0]["alph"], dav[dav["tree"] == 0]["p"], c = "r")
+ax.scatter(dav[dav["tree"] == 1]["alph"], dav[dav["tree"] == 1]["p"], c = "k",
+ marker = "^")
+ax.axvline(0, c = "k")
+plt.title("Discrimination scores", fontsize = 16)
+plt.show()
+
diff --git a/QID-1208-MVAdiscbh/MVAdiscbh_python.png b/QID-1208-MVAdiscbh/MVAdiscbh_python.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b26483151e9bba0ef191709a3c493e10744de59
GIT binary patch
literal 21948
zcmeFZXH-;Mmo{1`h=70+6^V+1L?uX)tYU%WB-s)H$UnB0)uhB*}&3oGD^~0!pSN
zXAlWRkwZaAzN^l8-?zKJ?)!Z`?zs2dt+s0RJI&QGn`P1pj<4zI+G%CVTzFzy$)KpdtJa4NUtT
zgAc`BA3bx`cC>W$fH_-0>|w62?Hpb0tY5IZTR6K|J30sp+!GMyV}Ir9`dU&@@ZXLL
zI67Mi20-pTgh1FK(1-Fmo+)e7Ua>lhsb|~jdtC)jD9#}RdKn&3hWrSK8N1ph&8;cU
zZIk>lz{E1!Vl-ei;1T@*%D0H+P6q=fm3-gFNX@(6$SQ
zr>D#L$oPiYBc162zvjODOp|Vu`gFmP-=SC9k*`*~g~2%pB;X4DcL(q+auPS~h#-)w
z568fVci)wfKp@XA!zdt-uk0-h;57Lle)ex0&1ZhuTKRoO=rn0j*JTaWR7u^)2RrX3
zCMPS?nym+KXKUS=_CGrzv7P_(qgp=~avhf~=nJK!q%?^9eqsud
zyJ1Ik3)Yixk4eVI6N6?n_51>+kz+lWgDog58L+RJz6~uXE*}1~Jx?)^qb_@*Q(avx
zxj$xZKE3ftiS^p*e&D+!RBRv)bMY&4$dxxVZhaD%<)X^IfoYG~;^woH&FHnzD`sAc
z^r~qO4BXt@R{AqTnV6VFtol-l?Cqy&H3_%8aOrCL#Dt-!h{&?h?4cfJp3%&wd}VcY
zZ>L*u_0N2yK7M1`ZCF{tIQkODW_d@8zHO~EKI
z6huZlRO4v2haFU!Z;u?+R+o;eE~Zs~pcyUVwX@JSH?CW#H{QeuHAKOy)g-Z;dn>~#
z(%$<+SVNyrT(UR|A>TKjyx>$+JVhzP;5o
zGAblYnJd*b`V`}Tn!77;w7)*sD>hqnGxCAfbiJE)v)_s9N`9`TGzRT|TA8DkS|HTpsvAB}ca?;66-gKsbUy_&3>3CM74k;rf+U3EOhq3Q@f2gORE~Tq)dJ
zcl0;XH}kD#_4@-m0e=hfm1o|^0
zWeP&s{GNq}hfD7E2v@)OP7WPlY}z83_B&dS&N6aD=?XRi9db^Fb{%E7Y
z4V+p~U9B5kW!_HZi&ZfjsCQefdOfEgz0+}XWiU6gPkjDkA3hBWY(-03J0@Pxtc16u
zRw0_OYgSTR`uc%+<(r-Ee6C+DX}}$>mKNscL)mwpnGDFU}gN58ZmEBm&;9mlJ07+sXD^4Sm|+I2C9Doz9ZvqPMp{vS&(s#7K
zF>SlII*KkRD5#i$uNLc-_g!lu-{CyO564k#H6@Hxcz!VYPbnt6ywY0v-QU9
zr#z{FcCK2ll+4)y;%wY&Hci^QsJ>oubwEY1+TLtpxj(ZQELzL<_U!3?4VW^Q?7{na
zmy*UE<-&>zp;hk+$5|QMg^o`n2Il=ePtm#{gouKcUR9wKB;GGAtNKN-c#^B#PwTz
zHp%%O#%Q}bQtX93=ymkV6h=SLetUt^d0JmrH?Hr&?$cR&sr9PC3R5YcKd-}?CA7en
z^~9VYj;1i2ok){9!X_v}M9Lh#@;$`n!ojPT-1OcX)^}Sks*dQgPf2MglzPHQDWR_sOFyGB^8@%)eQ
z!4v#!>8AhLk&U%=|LMt5CF>bsssIwfo*Al61#pK>8r3&2$lvXgQU^9X3?`Ydcbu=C
zYk6`^K;Twt*`c09;cCa(ramKIUz7~K4vh_FG+nk^J=$z8r4Xow8xm@7_03wq;=So#c_&pEQqWn|$~7
zCmk`ZE7V#)e(E8A(hYVv)znHqo{(#Kn^1UFyV
z5}i69DQk-I#*dtxZk`pCm*3mGZ!?tFIEn-A&??OPdgb16PNfE
zaNf0>zvk7(RNX|KORk#Kx(JKsuQwA-z72%C5yl`mbAm7SnDJ8LO7qOPK*^M4KZ(SS
z7n+%q34HEVtrL8=jP(MXOg0R$hM`Cv9Hv(3#-Tfu^_umjnW_$e2YQ2gVMSHA%B
zvpqdNu(7w-1^z(PVM<&YIPz3Qd&N+yVYahBN+-={_%od2*}mf;2!LIezl5#;XUWsy
z9o7wSuKHysO>eT8x^~Xf{xVo=)$?!XijC_kDkI{D?!80;M?3Aa+enq91a~kX
zd$udVxHX*tz{EjdD{`Pta{JtqO>4#DdxCD>A>6?!BW;a70a
z{Ks;BZrT9&St(@sY~r3sCAD^U+PRw_4#K2rk4;k+`0^LYxgc5*%bu$sfNB2oh_L1A
ze}CY`0b|bhKRcB?ScnnzKRtdHL84KjrFZCj8zdxc5fUIPgIu_R1ivqVApT#;33s{v
zO;(?+Z%mS|uga5&(l2FwUM(+VB!M`MRawWluTNMUJ$unQ0x}Q~>S?W6Lb%UkE2t80
zu|wF^Krj^%dGF)J|D4@`yS%;le{;uwpAMxzYZ(!1+NLCcx)O_9?E1V)JYWC4cIHg;
z2#LoatZW=9Hezgd0Q030j4vZ3LAD@pkB9`3*c|-y0JAq?TZ#oC&tQ>36gkZhU}kYW1k;;H}Tb8T7n*
zc_k$!8Vw-L<1Pq{^&6|O2y5D}F2#cP6Z|-W+2EZC7?o3jPuhr(hY=8zfGZ$HBN!G4
zk$9o?z;o_x0%V#%dDkrUBo3Aj7VrQ+&{l2>^2LW?x9p^GKNU+NX9335g9!8Y7(IAa
z=$F6;f2WgwFZeqXTie1A%Ii5bvwjU@szi|V<%>q|rjHMHt3f{5i;!*p*N3{`%#DUk
znd+LF)uyA3Ob-gk&&4aq%Y_HKm_iiFB)STqC%gs%F=2&Kltb}0Ad!PcPfScKPoIOh
zdIj;f-LBN<4WHqM$muJMDcFI4bY{FTZe(O6$D%u)KK~H}LTC1kA>;AEB+}lfJelxj
zepdb$iSXYuUmkeYeg*QJ2}WVUv?_iM^7N+Nm+luVN)S1Y%gFlLk_R7uNJc;c6xi+D
zoJ`!VhPyEnL4p;=R$97zul5#?M*Qc$yA}0WFOX_TUNkb%DG%uoA=^UCjH97vyGTpvTH0|
z(i-Qv*@B7%3a+-k3YL_JKU(lmczi%=16d3%3l8L7=qyj+YNi#EjP*{xpkaE^i2I#F
z8ncS;PQ!JD$Dz(tLy#_N7zN23W}$=LedZze&h#>g|HDBbO=8X|eue#1QMVq_j95AF9)USQYLQwV2~LXN3EsT!}e
zGNPxaA4!pLc`>^m!6H=z(i(&4A^@~T#l^*6kmjS0W7aoT2HKHzb>lX#UX=ldIC&tE
z
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
Ihfe