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 @@ - -[Visit QuantNet](http://quantlet.de/) - -## [Visit QuantNet](http://quantlet.de/) **MVAdiscbh** [Visit QuantNet 2.0](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 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 z 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 Ihfe