From e73a2acb3b0b1a8acdc985b8b58c9db7c264d460 Mon Sep 17 00:00:00 2001 From: Ziqi Li Date: Thu, 21 Jun 2018 12:01:56 -0700 Subject: [PATCH 1/7] fork --- mgwr/summary.py | 145 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 mgwr/summary.py diff --git a/mgwr/summary.py b/mgwr/summary.py new file mode 100644 index 0000000..cf7039e --- /dev/null +++ b/mgwr/summary.py @@ -0,0 +1,145 @@ +import numpy as np +from spglm.family import Gaussian, Binomial, Poisson +from spglm.glm import GLM + + +def summaryModel(self): + summary = '=' * 75 + '\n' + summary += "%-45s %s\n" % ('Model type', self.family.__class__.__name__) + summary += "%-45s %d\n" % ('Number of observations:', self.n) + summary += "%-45s %d\n" % ('Number of covariates:', self.k) + return summary + +def summaryGLM(self): + summary = '' + XNames = ["X"+str(i) for i in range(self.k)] + glm_rslt = GLM(self.model.y,self.model.X,constant=False,family=self.family).fit() + + summary += "\n%s\n" %('Global Regression Results') + summary += '-' * 75 + '\n' + summary += "%-62s %12.3f\n" % ('Residual sum of squares:', glm_rslt.deviance) + summary += "%-62s %12.3f\n" % ('Log-likelihood:', glm_rslt.llf) + summary += "%-62s %12.3f\n" % ('AIC:', glm_rslt.aic) + #summary += "%-62s %12.3f\n" % ('AICc:', glm_rslt.aicc) + summary += "%-62s %12.3f\n" % ('BIC:', glm_rslt.bic) + summary += "%-62s %12.3f\n" % ('R2:', glm_rslt.D2) + summary += "%-62s %12.3f\n\n" % ('Adj. R2:', glm_rslt.adj_D2) + + summary += "%-31s %10s %10s %10s %10s\n" % ('Variable', 'Est.', 'SE' ,'t(Est/SE)', 'p-value') + summary += "%-31s %10s %10s %10s %10s\n" % ('-'*31, '-'*10 ,'-'*10, '-'*10,'-'*10) + for i in range(self.k): + summary += "%-31s %10.3f %10.3f %10.3f %10.3f\n" % (XNames[i], glm_rslt.params[i], glm_rslt.bse[i], glm_rslt.tvalues[i], glm_rslt.pvalues[i]) + summary += "\n" + return summary + +def summaryGWR(self): + summary = '' + summary += "%s\n" %('Geographically Weighted Regression (GWR) Results') + + summary += '-' * 75 + '\n' + + if self.model.fixed: + summary += "%-50s %20s\n" % ('Spatial kernel:', 'Fixed ' + self.model.kernel) + else: + summary += "%-54s %20s\n" % ('Spatial kernel:', 'Adaptive ' + self.model.kernel) + + summary += "%-62s %12.3f\n" % ('Bandwidth used:', self.model.bw) + summary += "%-62s %12.3f\n" % ('Residual sum of squares:', self.resid_ss) + summary += "%-62s %12.3f\n" % ('Effective number of parameters (trace(S)):', self.tr_S) + summary += "%-62s %12.3f\n" % ('Residual Degree of freedom (n - trace(S)):', self.df_model) + summary += "%-62s %12.3f\n" % ('Sigma estimate:', np.sqrt(self.sigma2_v1)) + summary += "%-62s %12.3f\n" % ('Log-likelihood:', self.llf) + summary += "%-62s %12.3f\n" % ('AIC:', self.aic) + summary += "%-62s %12.3f\n" % ('AICc:', self.aicc) + summary += "%-62s %12.3f\n" % ('BIC:', self.bic) + + if isinstance(self.family, Gaussian): + #summary += "%-60s %12.6f\n" % ('CV:', 1.0) + summary += "%-62s %12.3f\n" % ('R2:', self.R2) + #summary += "%-60s %12.6f\n" % ('Adj. R2:', self.adjR2) + + #summary += "%-60s %12.6f\n" % ('Null deviance:', 0) + #summary += "%-60s %12.6f\n" % ('Residual deviance:', 0) + #summary += "%-60s %12.6f\n" % ('Percent deviance explained:', 0) + + summary += "%-62s %12.3f\n" % ('Adj. alpha at 95%:', self.adj_alpha[1]) + #summary += "%-60s %12.6f\n" % ('Adj. t-value at 95%:', self.critical_tval(self.adj_alpha[1])) + + summary += "\n" + + summary += "%s\n" % ('Summary Statistics For Varying (Local) Parameter Estimates') + summary += '-' * 75 + '\n' + summary += "%-20s %10s %10s %10s %10s %10s\n" % ('Variable', 'Mean' ,'STD', 'Min' ,'Median', 'Max') + summary += "%-20s %10s %10s %10s %10s %10s\n" % ('-'*20, '-'*10 ,'-'*10, '-'*10 ,'-'*10, '-'*10) + for i in range(self.k): + summary += "%-20s %10.3f %10.3f %10.3f %10.3f %10.3f\n" % (XNames[i], np.mean(self.params[:,i]) ,np.std(self.params[:,i]),np.min(self.params[:,i]) ,np.median(self.params[:,i]), np.max(self.params[:,i])) + + summary += '=' * 75 + '\n' + + return summary + + + +def summaryMGWR(self): + summary = '' + summary += "%s\n" %('Multi-Scale Geographically Weighted Regression (MGWR) Results') + + summary += '-' * 75 + '\n' + + if self.model.fixed: + summary += "%-50s %20s\n" % ('Spatial kernel:', 'Fixed ' + self.model.kernel) + else: + summary += "%-54s %20s\n" % ('Spatial kernel:', 'Adaptive ' + self.model.kernel) + + summary += "%s\n" % ('Model settings') + summary += '-' * 75 + '\n' + + summary += "%-45s %s\n" % ('Criterion for optimal bandwidth:', self.optimCriDropdown.currentText()) + summary += "%-45s %s\n" % ('Initialization choice:', self.initBeta) + summary += "%-45s %s\n" % ('Score of Change (SOC) type:', self.SOC) + summary += "%-45s %s\n\n" % ('Termination criterion for MGWR:', self.tol_multi) + + summary += "\n%s\n" %('MGWR bandwidth selection') + summary += '-' * 75 + '\n' + summary += "%-20s %30s %20s\n" % ('Variable', 'Optimal Bandwidth', 'ENP') + for j in range(len(self.XNames)): + summary += "%-20s %30.3f %20.3f\n" % (self.XNames[j], self.bws[j], self.results.ENP_j[j]) + + summary += "\n%s\n" % ('Diagnostic information') + summary += '-' * 75 + '\n' + summary += "%-60s %12.6f\n" % ('Residual sum of squares:', self.resid_ss) + summary += "%-60s %12.6f\n" % ('Effective number of parameters (trace(S)):', self.tr_S) + summary += "%-60s %12.6f\n" % ('Residual Degree of freedom (n - trace(S)):', self.df_model) + summary += "%-60s %12.6f\n" % ('Sigma estimate:', np.sqrt(self.sigma2)) + summary += "%-60s %12.6f\n" % ('-2Log-likelihood:', -2*self.llf) + summary += "%-60s %12.6f\n" % ('Classic AIC:', self.aic) + summary += "%-60s %12.6f\n" % ('AICc:', self.aicc) + summary += "%-60s %12.6f\n" % ('BIC:', self.bic) + + + summary += "%s\n" % ('Summary Statistics For Varying (Local) Parameter Estimates') + summary += '-' * 75 + '\n' + summary += "%-20s %10s %10s %10s %10s %10s\n" % ('Variable', 'Mean' ,'STD', 'Min' ,'Median', 'Max') + summary += "%-20s %10s %10s %10s %10s %10s\n" % ('-'*20, '-'*10 ,'-'*10, '-'*10 ,'-'*10, '-'*10) + for i in range(self.k): + summary += "%-20s %10.3f %10.3f %10.3f %10.3f %10.3f\n" % (XNames[i], np.mean(self.params[:,i]) ,np.std(self.params[:,i]),np.min(self.params[:,i]) ,np.median(self.params[:,i]), np.max(self.params[:,i])) + + summary += '=' * 75 + '\n' + return summary + + + + + + + + + + + + + + + + + From a9dd0930bd36468597e0ef976e9e79802e2e0611 Mon Sep 17 00:00:00 2001 From: Ziqi Li Date: Thu, 21 Jun 2018 12:15:10 -0700 Subject: [PATCH 2/7] gwr sum done --- mgwr/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 271 bytes mgwr/__pycache__/diagnostics.cpython-35.pyc | Bin 0 -> 2887 bytes mgwr/__pycache__/gwr.cpython-35.pyc | Bin 0 -> 68018 bytes mgwr/__pycache__/kernels.cpython-35.pyc | Bin 0 -> 5261 bytes mgwr/__pycache__/search.cpython-35.pyc | Bin 0 -> 6107 bytes mgwr/__pycache__/sel_bw.cpython-35.pyc | Bin 0 -> 16538 bytes mgwr/__pycache__/summary.cpython-35.pyc | Bin 0 -> 5936 bytes mgwr/gwr.py | 11 +++++++++++ mgwr/summary.py | 18 +++++++++--------- 9 files changed, 20 insertions(+), 9 deletions(-) create mode 100644 mgwr/__pycache__/__init__.cpython-35.pyc create mode 100644 mgwr/__pycache__/diagnostics.cpython-35.pyc create mode 100644 mgwr/__pycache__/gwr.cpython-35.pyc create mode 100644 mgwr/__pycache__/kernels.cpython-35.pyc create mode 100644 mgwr/__pycache__/search.cpython-35.pyc create mode 100644 mgwr/__pycache__/sel_bw.cpython-35.pyc create mode 100644 mgwr/__pycache__/summary.cpython-35.pyc diff --git a/mgwr/__pycache__/__init__.cpython-35.pyc b/mgwr/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c495dfac9f20aab92fb3a0baac2ff8953885b1f8 GIT binary patch literal 271 zcmX|*J8l9o5QfL=eV`yDI?k|)gbP{}QBbFeA|z8-kR2fl?*q>gl&jEZ$^LL> z){Yz{r*h)}2TokLA;F11p?}9-IYnH0;libS->mJpO@-7=_WAAGnYXhupZUI>nwTj3 z^3TkZzw?a!#YPSj{u)jd!Pt!Lz#44FV7AHZ6!T2BlhS^gd1>Zn*iMG|S+>XurVhab_2_4`+he=d@p>2W(sC53dzAUC|6e6}ffA z8=>S5Twg?v&6@|3`=RZ4s&M$>ccSOv?l-C>0v?H8NX}Z*7p_;XhyDp(f!()K@mN)K zlyXH7=N^QvQehB}t-C?!yTYp*)Cxzse{SGc{S0%&*dAlYhIR~gY_iDIeu_nD_RM7R z0gafNW!NNU>BwM{N0=s)O-;gwJB{e{<*DNo3)V(@XIYeE4O8d%iA7_S;~Az{_c@aS zX>^Jsnw|9Fp9PMi>O}nZosBy03a{hnP!jLI=?ZTzFU;~%rM$Rk&GN6qsO3mEXtsnu z%hzQmP<9w_5!igAC8QVOqEwlmuUI3g9#`*et>~w$;!!h|{nGx-f;CqPZtUM!K+^kS zU-SgWNQ76`-9NSP+{$P3OL+3)vQ^N@nwU#E*80wiTZ71RD<2y{oQ`B|J1)4&4OAq8 zx)Wy`!gsx%BpTzC=QU&so}?v;b4@3zVLVnkPJsrQp`fuJr-fUu|IXw&T>rZ~_fR=f z&F#2P-MLLi?MGpI&UU(v7q%Ta=c8j{>{HUp?Or_APhQ8qV2V<)eBQ{L7meA}v{5qT z1w@9((4%Qg8kryAoJEErCIbLbLQ0xN8NKdzn4Q+`vjcWCH&e%H7Oao7&JiDdR(@bn zp6wNMw=~-uC&WMnPy~mU`UC+&N^+D2Et$iY2^9$~yslw+9h95PSgxgVrSf*5Bxw>z zh>}v(THS=82Z(UH*o}2Z-=TohXgKxA?It7#9e>x6 zJZ$i`kivH&EG2ib#nDo4etzIaExrqU4_q5wb(TvcEv6WZq|1k@n( z+$zc}u4AJYn|?>;;L9;G)JhToBiNZiJ5H&NALsET*RJ6etc)C|Mny80$V|e-DS)Uc zOw4(@QGmIMQxQL`kT(I9anZP9OdHn?eRl{I4QU9~AGr7*sOVOTVYMMh z(3KlX5-{4!lSY9P5RzfR-H~nu7L5-u`;Cy>EA}()O%P+i=@c_ycP86WM)US-LIrqR zzq8R7rzA8gOj?(g-VQfXJ<7StZ&bXnS-NMPIq zo?#ugt*ltZ))+3^#-lf_8V>`nm&o~+6SYEHQGuCH3e1AVQH9%;g$gg-EH5P`Kn9Z66n6cIUAN>db@Ld0gh``# z`7yj9C$D_cJj5M*)BzH**umNd3;-tiCsq&~;DR81^B@9Q(U!^$+G}uNQPuP}iE$sq z>m8A%avG=AQyIls&&A?2Xk0Oillt$%e;{UgssI20 literal 0 HcmV?d00001 diff --git a/mgwr/__pycache__/gwr.cpython-35.pyc b/mgwr/__pycache__/gwr.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79e4b9db34dc3b0a1fbc84f0b3a7a00879ccac94 GIT binary patch literal 68018 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 z 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 GnSTSsj=L)W literal 0 HcmV?d00001 diff --git a/mgwr/__pycache__/search.cpython-35.pyc b/mgwr/__pycache__/search.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..628d6d897ba26b0edbeba0315d9e6d36f866fed9 GIT binary patch literal 6107 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 literal 0 HcmV?d00001 diff --git a/mgwr/__pycache__/sel_bw.cpython-35.pyc b/mgwr/__pycache__/sel_bw.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f08932a218c537e524fc7bf1f8b1efa72be0cee5 GIT binary patch literal 16538 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 YQ?ZW1-9Cwsj`vCHCAjo7`A+Bl8wN%>+5i9m literal 0 HcmV?d00001 diff --git a/mgwr/__pycache__/summary.cpython-35.pyc b/mgwr/__pycache__/summary.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f8e12fcedba70b4803d50e1ba388f0909362ff4 GIT binary patch literal 5936 zcmc&&-E!N;62B*##+57Bgu(X(jS-advU`?Abl%J7J9@+b0=-F+N zyYIDwmS_7S`y}wfFld)FVLW=g-q2_;{z%^xzN`3#FF+v6(b*LADZbU%8$3y6-Y~X{ zkH&U&*3{YbCrPK&jyjD2wp5hZseX2~WNsX5pCA1K^9aq1N9Go8-wLg{@^Wa#=6c|` zz7-vITZh8Kp$k*!)-wwliUF7QZw%u~k(%M3MS<*!+bp58thWo9S%@6;?_&Ml!TweMm zCJdKq-k!I#=7uk$ptIz-uUtRqxO}O#{W>AZdyAbzQApZyITYagXEq};oKBINjNw;1@=Z~ySZeS)IhLDB|CqbJto=aY4*5ekDO+olkCC( zdxANWl07=WKF^%Xbf}a9c!IJsIE7c3bCo&Qm}9YKS`9dOI%t{~tL!bzfd$Ueaeb3w zGqfbAnzW!@(t<)sYeKfVBKK};&q#pD5)G=Q>l?i-A{U`;s^S}3Alq_hUQE-Lz;$V( z*9tZdG1fX`1mx4Dy_PyogE3y~4eH8v-iv_~T%E!S`OezPA$uP9;v=`(hRJ zK2c+{T#3g9M455!p0m4XQO~8hg_WB$iFDw8Vv5{XorPDnzwaJhgSJQHHt~BsX;7JjzVl<2()Y=P)&Ws$L+-8%ht zY;LzgbcC+RMsj(f$aYi%s*jPp%<~O|qp+6S_FHux`Vpry!KaB(AUZiW!aO-3q@z5L zOuwux>!vm-158n;FjLgWwCmcmc26@kzKoH*^GxBsfUgWWf5*A|zL2A$%QS)soC=@> zIGO?;A%v({1Wz*^3)R!9 zJ%J%-nRDZ$A5RPF>ELgtBIjQj1zf!GfsC96n<4wCbxq5Rg|Xja7K!aMuorbJwTE^q z^@n!P$kh$)zBIhMnNh3Q`xe0(I?oNBMICW>@xKb%(!Wa@pMr0cbbbLpXL%qmqT>U6 z-wD~zHqQ##Dnu_oa)WJdcXm94bpOzL=6c&Zk?Zuw?De&1Y!-lh{qU5(QJ4 zD~(q>NP-Z!U%I^Q`jt5I&^v&z!Hg<@&#^m^_sX?SNB;5qcH4RFInj=_AG(O|!=d2A z2hFD2kW$*cJWK{PH$rM;%}3mBxbxLgsS?YYVkrL%FRs$b_`ZWqyOC{e%Ri0FwQ|_=xwP14o z5%nOSa)i+$ySEa%x9o#bN@6Hq!jK;To6k1i$H0*6%CyS_ntDOIu3yzJDe%;+c#A=VFE}ek-d)rO#cENe}Xs922+%F1g1%8gcxN|$m*-2rU0LSPH+HE_-Kq*WsQ|h z(({C`ccD|0(1|n?)gIt=r2Asu04mXzfemL)gT5ZD%CZ54L4WzyL)I?fDk)$q)anAR zVyoo64{#M5>H5^rg+hZ1%(Fq zV7sy=nQ10A-CF?+;1x_R!Eo5}0e_d}bX}lU1Hrx`*{BzNe&W-+HMJEz!GzlHJYdy;?Qw8Zx%d-^mRSd1x(18fO*!;TV+aDzE3Cp&xY2t`j3aUW9lj+bfXBk6UOj#p6mm{YBd&Z1-Y$&tWxo0f% zi7yjnd&z?^9&9{`r+ULB+Lft9Gvnzs&)#kagu<5B##({$B%Eqc3AE+KkH5DD{huWs z6AR^27@VZ?aY3y_Ewxg%+ zK~&3maGv{aWY-LMM=c)(e!WG3LFO|k)ZMmB6l%uSYn0*0VCa@aq;ZbxyZjzabDs#+ z#(a&)10oNJ^l}*fh#o10Q3(=VXUYtPKc?0?kqshWf^^dpD(Ho_dsamuMv|JIJd$=J zr1_YZ(Z-N(sO*ID6m@?{g+1jXm$enylEpr7ak>}~dDV#l^7=#GR?7PWnfFL>eOD6la)R!&MD7l9zkT1mOR0EB R_X`E6c+Mzf3)6+=e*t|x5Rw1@ literal 0 HcmV?d00001 diff --git a/mgwr/gwr.py b/mgwr/gwr.py index 422cd8a..687d277 100755 --- a/mgwr/gwr.py +++ b/mgwr/gwr.py @@ -15,6 +15,7 @@ from spglm.utils import cache_readonly from .diagnostics import get_AIC, get_AICc, get_BIC, corr from .kernels import * +from .summary import * fk = {'gaussian': fix_gauss, 'bisquare': fix_bisquare, 'exponential': fix_exp} ak = {'gaussian': adapt_gauss, 'bisquare': adapt_bisquare, 'exponential': adapt_exp} @@ -1153,6 +1154,16 @@ def predictions(self): predictions = np.sum(P*self.params, axis=1).reshape((-1,1)) return predictions + def summary(self): + """ + Print out summary + """ + summary = summaryModel(self) + summaryGLM(self) + summaryGWR(self) + print(summary) + return + + + class GWRResultsLite(object): """ Lightweight GWR that computes the minimum diagnostics needed for bandwidth diff --git a/mgwr/summary.py b/mgwr/summary.py index cf7039e..e0718b6 100644 --- a/mgwr/summary.py +++ b/mgwr/summary.py @@ -5,17 +5,17 @@ def summaryModel(self): summary = '=' * 75 + '\n' - summary += "%-45s %s\n" % ('Model type', self.family.__class__.__name__) - summary += "%-45s %d\n" % ('Number of observations:', self.n) - summary += "%-45s %d\n" % ('Number of covariates:', self.k) + summary += "%-54s %20s\n" % ('Model type', self.family.__class__.__name__) + summary += "%-60s %14d\n" % ('Number of observations:', self.n) + summary += "%-60s %14d\n\n" % ('Number of covariates:', self.k) return summary def summaryGLM(self): - summary = '' + XNames = ["X"+str(i) for i in range(self.k)] glm_rslt = GLM(self.model.y,self.model.X,constant=False,family=self.family).fit() - summary += "\n%s\n" %('Global Regression Results') + summary = "%s\n" %('Global Regression Results') summary += '-' * 75 + '\n' summary += "%-62s %12.3f\n" % ('Residual sum of squares:', glm_rslt.deviance) summary += "%-62s %12.3f\n" % ('Log-likelihood:', glm_rslt.llf) @@ -33,9 +33,9 @@ def summaryGLM(self): return summary def summaryGWR(self): - summary = '' - summary += "%s\n" %('Geographically Weighted Regression (GWR) Results') - + XNames = ["X"+str(i) for i in range(self.k)] + + summary = "%s\n" %('Geographically Weighted Regression (GWR) Results') summary += '-' * 75 + '\n' if self.model.fixed: @@ -47,7 +47,7 @@ def summaryGWR(self): summary += "%-62s %12.3f\n" % ('Residual sum of squares:', self.resid_ss) summary += "%-62s %12.3f\n" % ('Effective number of parameters (trace(S)):', self.tr_S) summary += "%-62s %12.3f\n" % ('Residual Degree of freedom (n - trace(S)):', self.df_model) - summary += "%-62s %12.3f\n" % ('Sigma estimate:', np.sqrt(self.sigma2_v1)) + summary += "%-62s %12.3f\n" % ('Sigma estimate:', np.sqrt(self.sigma2)) summary += "%-62s %12.3f\n" % ('Log-likelihood:', self.llf) summary += "%-62s %12.3f\n" % ('AIC:', self.aic) summary += "%-62s %12.3f\n" % ('AICc:', self.aicc) From 943937347c8f69cda30807c491b1e00aaa6dfcb6 Mon Sep 17 00:00:00 2001 From: Ziqi Li Date: Thu, 21 Jun 2018 16:04:50 -0700 Subject: [PATCH 3/7] summary for mgwr --- mgwr/__pycache__/gwr.cpython-35.pyc | Bin 68018 -> 68258 bytes mgwr/__pycache__/summary.cpython-35.pyc | Bin 5936 -> 6148 bytes mgwr/gwr.py | 18 ++++++--- mgwr/summary.py | 50 +++++++++++++----------- 4 files changed, 41 insertions(+), 27 deletions(-) diff --git a/mgwr/__pycache__/gwr.cpython-35.pyc b/mgwr/__pycache__/gwr.cpython-35.pyc index 79e4b9db34dc3b0a1fbc84f0b3a7a00879ccac94..bbcda296211dd63230e54e50a192eaa1a4fc8ba7 100644 GIT binary patch delta 509 zcmdlqnPt&b7A|pKUatQdI?+|^8@YlOTB&m>KtVuJW?qRxerbtap-44&0&j6g9_egPiAqFa;w&r34Co;-K4>*RIkX9>$Nq{uR~ zFfc?3GNf=Y1Z&C_-QDbeAy$I%_T;rMRM>8VtO*2JGx^nv3qZl$FSCG_sJ$v-VtlxH z_M1!0jE^?weOM&G$huvSk#R25n=DZ)Ik|5R$K9}ywoiz5h%u7X@}4M;?B!vX`SwCFleM3bpV7bJUQvf_DhHGOuVf7yV1 z1{MWIF2*WhkdZ;D#icnV#d=V!nnIJKSIe_K1nGJ-J)ND=5Gf$F?*fH4vI0$!0Wx^z zu`%+n3$X|Z@XH8k0cj}Y(H62Vy1V@LvZR84CXr|1i00jX>nRz7&`K2Wa#ihBqiA9xg89z;y zC?2SwZ+=Q@PSoUS3+))MZN9otgOTytWQFq*o5dFAa&TW~U|=X}1Q8iv!DXwvl^Abs zHaf?~D18Gce42%Up_m8A;91Sa2ow|L7vK>rx-t2;r6lA1$qN^|PTq8W7CQ$+u%=AW z?alEQVkH=FPTu=Mh3zKD%)rTsF~XC7y|@4rJpD2YXt3F<5+=s`n^(WN#LW0$bKQqU z0*uVt6&V@lGHtGyUC*@Lo{dqMkx5f9Jglt^nta BZ7=`; diff --git a/mgwr/__pycache__/summary.cpython-35.pyc b/mgwr/__pycache__/summary.cpython-35.pyc index 9f8e12fcedba70b4803d50e1ba388f0909362ff4..f226bdc3e9cdffd0954b1156be028222fef08dcf 100644 GIT binary patch delta 1908 zcmaJ>Pi!J(6o2198HNHa107nRbXb?QXiM348*Q!Cwd>!w+wG!u?b;BQfh`0|J2TZT z>4q5fpvhkROxB}`2M?O8MiUcHdo$6C=ic;U^sonyO^m+x4ND7g1?I>5-v9T_d++P) z`#B{V2>4#gPF<^gquldIei#4Q^SOHnjA8z+H!&LkBLoKkH4juI(4M#@!GQz@vQ@#B z``KasnXIu0|6ZOL9T6)2eie=1m$lKT5C;2&qdeiAsC~gYQO1N;xL+$K*by+|FxHn> zLWrEuj>3Da$6SU7Rk*+yrz+JX7@6bZ@RZ|sy?W$PIACz#f-zfxnkM{4c}f|TN4s>A zIUFY;hmLooYoS){yx#rM@?q4P#9 zs~77#TSa|xVLqK%{DT2NOBH;3`t4$UuPg-o?{IXX!Brybm23>@E|2e8VB;q6q4%_Bk01!hyUjsk`cj6t4|W3pe+0sgcc zZ6h5N7l+CNJ^ki5K%NZdPr?W4=A3xjXoHuFjI+lHs9=OoxbpVA{@L#9@5!?*{EUDx z=lI!Q0ULx92G~FsHfQ0MOXy%rI$c3yfypYOMd;uYRK?|Z*qveG#mA^iyOYxsRQO9^ z7s5ds?FV}jMSfBw&^tiLo)GLnzqSr`5Nbn0I7~^OoD4Ke2}!7*eM+#~YCr!G!S5YC z^m1CTBR$$!V*39|JOjqLV>zCla!&g{b}yOV^D1q(xR9*4U^k8(mg5Yv1_sdY16)6D z3O$D9k=WTH4;4Fu`cSd6UAp4ce(%mycjYI=6^~QG?#Iq}&-6CE1o_MozoS&AuF|+j z2nw_&ti48~Xx_Z|;`){BQoV`OYAqvCwd_)}v9ruS3Vp&C)YRfpJYQ;>WxZL^SGJ1V zH_G~Cesv|I+c$U0i-)c&`TWsfzR_&jTh;9wdZp!0PtTvT^z>|wf2yXnAqt>hFK!#} zR1JH}Y7M8SXXp5DYC1LW{H4od}=PG1}f4){{6D9c%?lk|?cboqczWZcG zGV_?e`5M9l`gNpR!+lYF8J8I&%{K_v`78eYHdSxFNw7h1jo>YUO@vI`Oc5O*I7P5b z@C?GC*DBY`CA(=JDzwnac2$=yhNc0TPYEx^Jx%C19ND0Zqg17{o#W^kwu@J7uaayKg eLFWEzmAYuXb{8l!i~LLNWe=@UB#*RtHuo=9L}_FI delta 1977 zcmZ`(&u<$=6n?XttnH2MB>u6E?KIhhI>jn+9h(#-R7H?dRFR}njhf=B6xXv();Qi| zccZjcA|G0WkdQdcnG2i{9Eys#Qcgjt#1$#<59CsD?5W|+tW6b@XjgA%zxU?N_r7^E zkMfUmfkY^zK6!Eew)|7zsUrO@v1iJ6g%Hp|*afI7P?JD=Yfpk*2`Iut0`~R7!|bU~ zBN6teZ=C(=QzF6MfEWw=wUM}(9qx5%?2>={jW0-Njf9Ab_C}2eI0iHcN%n(3*_T3Q z>>ovoBegWpsaHhtZ<^`DsX1BjJ`1}9c4bJq0jPT%G@!uW&#^L@uata9fV;iLHFhpA zMl^OcFm~(I(3Bu_qPwPeWVT+ARbEvFr~)zSgG5KmQa1PGufQB(g@GSOBJa|APOmgJ z*DHF()#qk2^M?cg*x#{F*jn&8Nwb@wFWK|Z>ZOYa0~wW65|M&rLK>4&Bq1KX^G!$* zDd9`YsuU&>62?a(KO<(Zu*XWWy&+@W1olu60u-sqoT>NM2ecnqDx4)Exc~SPuuCG= z2ha$x!cuhtS!3kJf+P*xw6# z-PmnXFM1egM5O9AsRu`a#<0@%$)zHNIM5kSiu;S;`gt>O1ysPs!1v0XS>VS2BaD~+dUi}YlP1Tc<@;12&3e< z^iVH64(>42JprPecXy9C3!K*0ffmHn7{q#flLC+TPI*nhS}%-;3JD~R!J^YoYbPWy z1#Mb<)o)Wk=R1<`bIEza5l`%2U=PnOPRW6*dS@5w@{~`Vcy`g978y=;bAj7XKh^Ik zeX842{6x2R+zD)bBZ=+4aQq+#e>ADz71(yld4*Q_+mR>d`~re0mQ%&IZpN|&mZZRl1_Us$g+*9`sj()ER`?mpN= zr`k!vzKUiteJUnvjVyhzdPBcgY0@2&y6d=L!>IC%t)a|xAB6G5Hr+5kGaBZ)WzqRV3Gbs;aG_Cg9J8vk zXR+VTwFZyZr)Fh4g<Hm}&$Cbf2&<$>z9Z5vJZBjdhX_M0f&dxl#n%cx8_;98Bl8`}-nv?p-( zf!r{f_643tzPIBX_-rHSpw~I*M-lGU+4ov;CdAkJkel<|EON8N%`!LF(PaDVFdq-1 zIUseWhvRn!ob8Q`iv55K&I@#|q5-0iFy6f0J init_sd, axis=0) / float(n_iters)) return p_vals + + def summary(self): + """ + Print out MGWR summary + """ + summary = summaryModel(self) + summaryGLM(self) + summaryMGWR(self) + print(summary) + return diff --git a/mgwr/summary.py b/mgwr/summary.py index e0718b6..719d309 100644 --- a/mgwr/summary.py +++ b/mgwr/summary.py @@ -44,9 +44,12 @@ def summaryGWR(self): summary += "%-54s %20s\n" % ('Spatial kernel:', 'Adaptive ' + self.model.kernel) summary += "%-62s %12.3f\n" % ('Bandwidth used:', self.model.bw) + + summary += "\n%s\n" % ('Diagnostic information') + summary += '-' * 75 + '\n' summary += "%-62s %12.3f\n" % ('Residual sum of squares:', self.resid_ss) summary += "%-62s %12.3f\n" % ('Effective number of parameters (trace(S)):', self.tr_S) - summary += "%-62s %12.3f\n" % ('Residual Degree of freedom (n - trace(S)):', self.df_model) + summary += "%-62s %12.3f\n" % ('Degree of freedom (n - trace(S)):', self.df_model) summary += "%-62s %12.3f\n" % ('Sigma estimate:', np.sqrt(self.sigma2)) summary += "%-62s %12.3f\n" % ('Log-likelihood:', self.llf) summary += "%-62s %12.3f\n" % ('AIC:', self.aic) @@ -62,8 +65,8 @@ def summaryGWR(self): #summary += "%-60s %12.6f\n" % ('Residual deviance:', 0) #summary += "%-60s %12.6f\n" % ('Percent deviance explained:', 0) - summary += "%-62s %12.3f\n" % ('Adj. alpha at 95%:', self.adj_alpha[1]) - #summary += "%-60s %12.6f\n" % ('Adj. t-value at 95%:', self.critical_tval(self.adj_alpha[1])) + summary += "%-62s %12.3f\n" % ('Adj. alpha (95%):', self.adj_alpha[1]) + summary += "%-62s %12.3f\n" % ('Adj. t-value(95%):', self.critical_tval(self.adj_alpha[1])) summary += "\n" @@ -81,6 +84,9 @@ def summaryGWR(self): def summaryMGWR(self): + + XNames = ["X"+str(i) for i in range(self.k)] + summary = '' summary += "%s\n" %('Multi-Scale Geographically Weighted Regression (MGWR) Results') @@ -91,33 +97,33 @@ def summaryMGWR(self): else: summary += "%-54s %20s\n" % ('Spatial kernel:', 'Adaptive ' + self.model.kernel) - summary += "%s\n" % ('Model settings') - summary += '-' * 75 + '\n' + summary += "%-54s %20s\n" % ('Criterion for optimal bandwidth:', self.model.selector.criterion) - summary += "%-45s %s\n" % ('Criterion for optimal bandwidth:', self.optimCriDropdown.currentText()) - summary += "%-45s %s\n" % ('Initialization choice:', self.initBeta) - summary += "%-45s %s\n" % ('Score of Change (SOC) type:', self.SOC) - summary += "%-45s %s\n\n" % ('Termination criterion for MGWR:', self.tol_multi) + if self.model.selector.rss_score: + summary += "%-54s %20s\n" % ('Score of Change (SOC) type:', 'RSS') + else: + summary += "%-54s %20s\n" % ('Score of Change (SOC) type:', 'Smoothing f') + summary += "%-54s %20s\n\n" % ('Termination criterion for MGWR:', self.model.selector.tol_multi) - summary += "\n%s\n" %('MGWR bandwidth selection') + summary += "%s\n" %('MGWR bandwidths') summary += '-' * 75 + '\n' - summary += "%-20s %30s %20s\n" % ('Variable', 'Optimal Bandwidth', 'ENP') - for j in range(len(self.XNames)): - summary += "%-20s %30.3f %20.3f\n" % (self.XNames[j], self.bws[j], self.results.ENP_j[j]) + summary += "%-23s %30s %20s\n" % ('Variable', 'Optimal Bandwidth', 'ENP_j') + for j in range(self.k): + summary += "%-23s %30.3f %20.3f\n" % (XNames[j], self.model.bw[j], self.ENP_j[j]) summary += "\n%s\n" % ('Diagnostic information') summary += '-' * 75 + '\n' - summary += "%-60s %12.6f\n" % ('Residual sum of squares:', self.resid_ss) - summary += "%-60s %12.6f\n" % ('Effective number of parameters (trace(S)):', self.tr_S) - summary += "%-60s %12.6f\n" % ('Residual Degree of freedom (n - trace(S)):', self.df_model) - summary += "%-60s %12.6f\n" % ('Sigma estimate:', np.sqrt(self.sigma2)) - summary += "%-60s %12.6f\n" % ('-2Log-likelihood:', -2*self.llf) - summary += "%-60s %12.6f\n" % ('Classic AIC:', self.aic) - summary += "%-60s %12.6f\n" % ('AICc:', self.aicc) - summary += "%-60s %12.6f\n" % ('BIC:', self.bic) + summary += "%-62s %12.3f\n" % ('Residual sum of squares:', self.resid_ss) + summary += "%-62s %12.3f\n" % ('Effective number of parameters (trace(S)):', self.tr_S) + summary += "%-62s %12.3f\n" % ('Degree of freedom (n - trace(S)):', self.df_model) + summary += "%-62s %12.3f\n" % ('Sigma estimate:', np.sqrt(self.sigma2)) + summary += "%-62s %12.3f\n" % ('Log-likelihood:', self.llf) + summary += "%-62s %12.3f\n" % ('AIC:', self.aic) + summary += "%-62s %12.3f\n" % ('AICc:', self.aicc) + summary += "%-62s %12.3f\n" % ('BIC:', self.bic) - summary += "%s\n" % ('Summary Statistics For Varying (Local) Parameter Estimates') + summary += "\n%s\n" % ('Summary Statistics For Varying (Local) Parameter Estimates') summary += '-' * 75 + '\n' summary += "%-20s %10s %10s %10s %10s %10s\n" % ('Variable', 'Mean' ,'STD', 'Min' ,'Median', 'Max') summary += "%-20s %10s %10s %10s %10s %10s\n" % ('-'*20, '-'*10 ,'-'*10, '-'*10 ,'-'*10, '-'*10) From 22e7d8b1f202e3267f815049f5ddf16ecd1a260f Mon Sep 17 00:00:00 2001 From: Ziqi Li Date: Thu, 21 Jun 2018 16:45:13 -0700 Subject: [PATCH 4/7] summary --- mgwr/__pycache__/summary.cpython-35.pyc | Bin 6148 -> 6505 bytes mgwr/summary.py | 84 ++++++++++++------------ 2 files changed, 41 insertions(+), 43 deletions(-) diff --git a/mgwr/__pycache__/summary.cpython-35.pyc b/mgwr/__pycache__/summary.cpython-35.pyc index f226bdc3e9cdffd0954b1156be028222fef08dcf..7c6554ac0ef809a453d980e80219999060ff14be 100644 GIT binary patch delta 1330 zcmb_bOHUI~6h7xpnYP2s^kF-tl$I%IkO-yt03|9y#8%$QJ>R{P|GZO6 z7=~8r?>b*hz0^h-+s5dPnxPpsYS#iV4^UB|7K8-`jvwb0;Elj_m}gMYXoXo6QzCxT zjdl9Ttm6huGO+q@DX_LV>@J#{f-u=E&tAb;g9UGzh{rvWtX*Bz*~P; zCZYiF7Km{hcoujY@OE;Pc3%eOk)A2ZyzEg_>4T(XqAI~A8@votD_D>@HCXHPZ0A<` z5IjJwz8}Yehf6c%iE6PlFqb-Aa*CyD&E{*8U7EdqWujay@qsyeh*xs<^?&Z5WWzGX zXtiNSSSwGLtJ5`^)L{TXih6H%P7q)%m}eSBSrilUV-lNP^mu}qm_-YRP(!DeUZ_cY zK#$Ef`l3GSuc_{c{UBy7NBjguuiOA0arNNZc$mCSDU16Mj?n12-=e;-d0R*^sOeBK z+yxUBu>Ob`g*dW4=#5O4D~IcMCtNvFFE_bzv|c722uGxI{#xBBQQiOiJ6#Tp`a{6e z!UObGwdiAD5OvA~Gd^(xO_U9$BuTE5=5>-1q*VA8r!jpz8P)4ypZXl+CE$u?-q3WhycJA*DyL}S%x(WdkFJ*hC$mi(QgZR zu`h*NmuAfG3i2f?2#4w#=MgIXfU3{y|k$BqxY(_sbBLw{9g?&_ zPp$Ncqmphk;2e`-r-V@nT@uD5oRn}%!f64W4UQ?f?9K@Zc#jpb&G=a3^o^@mC!CwI zq)S5g`eiLlMcJj-ahioN!c3Nyw;*&&JRrI1J)eymV00~!#u2)o=)+!moj9P_`kr4k CkO7$h delta 1016 zcmZ{iOHUI~6vywqQ>N{0JJScuOrMm8K;=~+!55;S5f{Y;Myg?9nhuaQP-Lczr`*qHhSbm786pKpXGWW zz;BL?tdxz{Jjd7pg?KOp4_QvBNyPLK(@$!Qls&K|X@-}qF`}J&B$4K#;w*9qN*X+o zLhhh5_romC2PCC8Ld?Y94{+uoW|VZANn)mm*-gwegj{`#aZ;nC<|0wC73ORzwWTm` zlZ70$)^U<`dxGXgDV#Kmx}E8%KXzT99kDZ`Qxotu&;=>^1r5VHc^H1n2TGdY#S%2j zI1N*H?$+a3BtYMIRh{qVPVXa7?2)C;($#ZBA+b%5WCd7OrAXu$B<1hRGfy)=SzfChG9W zQ=ap=u`MS>O0dXRs25)GlnXaE;E>0Kh@OhrsfeS9@ikdAn33%n$ockYfBlnhit@8d zt9HrUDQu+SXICCp0u%Hi+|qP)xnS*E=^sVWzv|w4d?%clDP<@7BLX zIBWCue@~8|1W3v>9BK0{cl+|JDD4V-*2jHUh0KdE2R*9hIHU U2fNmFI5MVb7BbPxlIEZK10dPPD*ylh diff --git a/mgwr/summary.py b/mgwr/summary.py index 719d309..cb78d62 100644 --- a/mgwr/summary.py +++ b/mgwr/summary.py @@ -2,7 +2,6 @@ from spglm.family import Gaussian, Binomial, Poisson from spglm.glm import GLM - def summaryModel(self): summary = '=' * 75 + '\n' summary += "%-54s %20s\n" % ('Model type', self.family.__class__.__name__) @@ -17,13 +16,23 @@ def summaryGLM(self): summary = "%s\n" %('Global Regression Results') summary += '-' * 75 + '\n' - summary += "%-62s %12.3f\n" % ('Residual sum of squares:', glm_rslt.deviance) - summary += "%-62s %12.3f\n" % ('Log-likelihood:', glm_rslt.llf) - summary += "%-62s %12.3f\n" % ('AIC:', glm_rslt.aic) - #summary += "%-62s %12.3f\n" % ('AICc:', glm_rslt.aicc) - summary += "%-62s %12.3f\n" % ('BIC:', glm_rslt.bic) - summary += "%-62s %12.3f\n" % ('R2:', glm_rslt.D2) - summary += "%-62s %12.3f\n\n" % ('Adj. R2:', glm_rslt.adj_D2) + + if isinstance(self.family, Gaussian): + summary += "%-62s %12.3f\n" % ('Residual sum of squares:', glm_rslt.deviance) + summary += "%-62s %12.3f\n" % ('Log-likelihood:', glm_rslt.llf) + summary += "%-62s %12.3f\n" % ('AIC:', glm_rslt.aic) + #summary += "%-62s %12.3f\n" % ('AICc:', glm_rslt.aicc) + summary += "%-62s %12.3f\n" % ('BIC:', glm_rslt.bic) + summary += "%-62s %12.3f\n" % ('R2:', glm_rslt.D2) + summary += "%-62s %12.3f\n\n" % ('Adj. R2:', glm_rslt.adj_D2) + else: + summary += "%-62s %12.3f\n" % ('Deviance:', glm_rslt.deviance) + summary += "%-62s %12.3f\n" % ('Log-likelihood:', glm_rslt.llf) + summary += "%-62s %12.3f\n" % ('AIC:', glm_rslt.aic) + #summary += "%-62s %12.3f\n" % ('AICc:', glm_rslt.aicc) + summary += "%-62s %12.3f\n" % ('BIC:', glm_rslt.bic) + summary += "%-62s %12.3f\n" % ('Percent deviance explained:', glm_rslt.D2) + summary += "%-62s %12.3f\n\n" % ('Adj. percent deviance explained:', glm_rslt.adj_D2) summary += "%-31s %10s %10s %10s %10s\n" % ('Variable', 'Est.', 'SE' ,'t(Est/SE)', 'p-value') summary += "%-31s %10s %10s %10s %10s\n" % ('-'*31, '-'*10 ,'-'*10, '-'*10,'-'*10) @@ -47,30 +56,32 @@ def summaryGWR(self): summary += "\n%s\n" % ('Diagnostic information') summary += '-' * 75 + '\n' - summary += "%-62s %12.3f\n" % ('Residual sum of squares:', self.resid_ss) - summary += "%-62s %12.3f\n" % ('Effective number of parameters (trace(S)):', self.tr_S) - summary += "%-62s %12.3f\n" % ('Degree of freedom (n - trace(S)):', self.df_model) - summary += "%-62s %12.3f\n" % ('Sigma estimate:', np.sqrt(self.sigma2)) - summary += "%-62s %12.3f\n" % ('Log-likelihood:', self.llf) - summary += "%-62s %12.3f\n" % ('AIC:', self.aic) - summary += "%-62s %12.3f\n" % ('AICc:', self.aicc) - summary += "%-62s %12.3f\n" % ('BIC:', self.bic) - + if isinstance(self.family, Gaussian): - #summary += "%-60s %12.6f\n" % ('CV:', 1.0) + + summary += "%-62s %12.3f\n" % ('Residual sum of squares:', self.resid_ss) + summary += "%-62s %12.3f\n" % ('Effective number of parameters (trace(S)):', self.tr_S) + summary += "%-62s %12.3f\n" % ('Degree of freedom (n - trace(S)):', self.df_model) + summary += "%-62s %12.3f\n" % ('Sigma estimate:', np.sqrt(self.sigma2)) + summary += "%-62s %12.3f\n" % ('Log-likelihood:', self.llf) + summary += "%-62s %12.3f\n" % ('AIC:', self.aic) + summary += "%-62s %12.3f\n" % ('AICc:', self.aicc) + summary += "%-62s %12.3f\n" % ('BIC:', self.bic) summary += "%-62s %12.3f\n" % ('R2:', self.R2) - #summary += "%-60s %12.6f\n" % ('Adj. R2:', self.adjR2) - - #summary += "%-60s %12.6f\n" % ('Null deviance:', 0) - #summary += "%-60s %12.6f\n" % ('Residual deviance:', 0) + else: + summary += "%-62s %12.3f\n" % ('Effective number of parameters (trace(S)):', self.tr_S) + summary += "%-62s %12.3f\n" % ('Degree of freedom (n - trace(S)):', self.df_model) + summary += "%-62s %12.3f\n" % ('Log-likelihood:', self.llf) + summary += "%-62s %12.3f\n" % ('AIC:', self.aic) + summary += "%-62s %12.3f\n" % ('AICc:', self.aicc) + summary += "%-62s %12.3f\n" % ('BIC:', self.bic) #summary += "%-60s %12.6f\n" % ('Percent deviance explained:', 0) + summary += "%-62s %12.3f\n" % ('Adj. alpha (95%):', self.adj_alpha[1]) summary += "%-62s %12.3f\n" % ('Adj. t-value(95%):', self.critical_tval(self.adj_alpha[1])) - summary += "\n" - - summary += "%s\n" % ('Summary Statistics For Varying (Local) Parameter Estimates') + summary += "\n%s\n" % ('Summary Statistics For GWR Parameter Estimates') summary += '-' * 75 + '\n' summary += "%-20s %10s %10s %10s %10s %10s\n" % ('Variable', 'Mean' ,'STD', 'Min' ,'Median', 'Max') summary += "%-20s %10s %10s %10s %10s %10s\n" % ('-'*20, '-'*10 ,'-'*10, '-'*10 ,'-'*10, '-'*10) @@ -89,7 +100,6 @@ def summaryMGWR(self): summary = '' summary += "%s\n" %('Multi-Scale Geographically Weighted Regression (MGWR) Results') - summary += '-' * 75 + '\n' if self.model.fixed: @@ -103,6 +113,7 @@ def summaryMGWR(self): summary += "%-54s %20s\n" % ('Score of Change (SOC) type:', 'RSS') else: summary += "%-54s %20s\n" % ('Score of Change (SOC) type:', 'Smoothing f') + summary += "%-54s %20s\n\n" % ('Termination criterion for MGWR:', self.model.selector.tol_multi) summary += "%s\n" %('MGWR bandwidths') @@ -113,17 +124,18 @@ def summaryMGWR(self): summary += "\n%s\n" % ('Diagnostic information') summary += '-' * 75 + '\n' + summary += "%-62s %12.3f\n" % ('Residual sum of squares:', self.resid_ss) summary += "%-62s %12.3f\n" % ('Effective number of parameters (trace(S)):', self.tr_S) summary += "%-62s %12.3f\n" % ('Degree of freedom (n - trace(S)):', self.df_model) + summary += "%-62s %12.3f\n" % ('Sigma estimate:', np.sqrt(self.sigma2)) summary += "%-62s %12.3f\n" % ('Log-likelihood:', self.llf) summary += "%-62s %12.3f\n" % ('AIC:', self.aic) summary += "%-62s %12.3f\n" % ('AICc:', self.aicc) summary += "%-62s %12.3f\n" % ('BIC:', self.bic) - - - summary += "\n%s\n" % ('Summary Statistics For Varying (Local) Parameter Estimates') + + summary += "\n%s\n" % ('Summary Statistics For MGWR Parameter Estimates') summary += '-' * 75 + '\n' summary += "%-20s %10s %10s %10s %10s %10s\n" % ('Variable', 'Mean' ,'STD', 'Min' ,'Median', 'Max') summary += "%-20s %10s %10s %10s %10s %10s\n" % ('-'*20, '-'*10 ,'-'*10, '-'*10 ,'-'*10, '-'*10) @@ -135,17 +147,3 @@ def summaryMGWR(self): - - - - - - - - - - - - - - From 9ec16127ea29d25f907823302eba0a2a771f38b0 Mon Sep 17 00:00:00 2001 From: Ziqi Li Date: Thu, 21 Jun 2018 16:49:13 -0700 Subject: [PATCH 5/7] rm pyc --- mgwr/__pycache__/__init__.cpython-35.pyc | Bin 271 -> 0 bytes mgwr/__pycache__/diagnostics.cpython-35.pyc | Bin 2887 -> 0 bytes mgwr/__pycache__/gwr.cpython-35.pyc | Bin 68258 -> 0 bytes mgwr/__pycache__/kernels.cpython-35.pyc | Bin 5261 -> 0 bytes mgwr/__pycache__/search.cpython-35.pyc | Bin 6107 -> 0 bytes mgwr/__pycache__/sel_bw.cpython-35.pyc | Bin 16538 -> 0 bytes mgwr/__pycache__/summary.cpython-35.pyc | Bin 6505 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mgwr/__pycache__/__init__.cpython-35.pyc delete mode 100644 mgwr/__pycache__/diagnostics.cpython-35.pyc delete mode 100644 mgwr/__pycache__/gwr.cpython-35.pyc delete mode 100644 mgwr/__pycache__/kernels.cpython-35.pyc delete mode 100644 mgwr/__pycache__/search.cpython-35.pyc delete mode 100644 mgwr/__pycache__/sel_bw.cpython-35.pyc delete mode 100644 mgwr/__pycache__/summary.cpython-35.pyc diff --git a/mgwr/__pycache__/__init__.cpython-35.pyc b/mgwr/__pycache__/__init__.cpython-35.pyc deleted file mode 100644 index c495dfac9f20aab92fb3a0baac2ff8953885b1f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmX|*J8l9o5QfL=eV`yDI?k|)gbP{}QBbFeA|z8-kR2fl?*q>gl&jEZ$^LL> z){Yz{r*h)}2TokLA;F11p?}9-IYnH0;libS->mJpO@-7=_WAAGnYXhupZUI>nwTj3 z^3TkZzw?a!#YPSj{u)jd!Pt!Lz#44FV7AHZ6!T2BlhS^gd1>Zn*iMG|S+>XurVhab_2_4`+he=d@p>2W(sC53dzAUC|6e6}ffA z8=>S5Twg?v&6@|3`=RZ4s&M$>ccSOv?l-C>0v?H8NX}Z*7p_;XhyDp(f!()K@mN)K zlyXH7=N^QvQehB}t-C?!yTYp*)Cxzse{SGc{S0%&*dAlYhIR~gY_iDIeu_nD_RM7R z0gafNW!NNU>BwM{N0=s)O-;gwJB{e{<*DNo3)V(@XIYeE4O8d%iA7_S;~Az{_c@aS zX>^Jsnw|9Fp9PMi>O}nZosBy03a{hnP!jLI=?ZTzFU;~%rM$Rk&GN6qsO3mEXtsnu z%hzQmP<9w_5!igAC8QVOqEwlmuUI3g9#`*et>~w$;!!h|{nGx-f;CqPZtUM!K+^kS zU-SgWNQ76`-9NSP+{$P3OL+3)vQ^N@nwU#E*80wiTZ71RD<2y{oQ`B|J1)4&4OAq8 zx)Wy`!gsx%BpTzC=QU&so}?v;b4@3zVLVnkPJsrQp`fuJr-fUu|IXw&T>rZ~_fR=f z&F#2P-MLLi?MGpI&UU(v7q%Ta=c8j{>{HUp?Or_APhQ8qV2V<)eBQ{L7meA}v{5qT z1w@9((4%Qg8kryAoJEErCIbLbLQ0xN8NKdzn4Q+`vjcWCH&e%H7Oao7&JiDdR(@bn zp6wNMw=~-uC&WMnPy~mU`UC+&N^+D2Et$iY2^9$~yslw+9h95PSgxgVrSf*5Bxw>z zh>}v(THS=82Z(UH*o}2Z-=TohXgKxA?It7#9e>x6 zJZ$i`kivH&EG2ib#nDo4etzIaExrqU4_q5wb(TvcEv6WZq|1k@n( z+$zc}u4AJYn|?>;;L9;G)JhToBiNZiJ5H&NALsET*RJ6etc)C|Mny80$V|e-DS)Uc zOw4(@QGmIMQxQL`kT(I9anZP9OdHn?eRl{I4QU9~AGr7*sOVOTVYMMh z(3KlX5-{4!lSY9P5RzfR-H~nu7L5-u`;Cy>EA}()O%P+i=@c_ycP86WM)US-LIrqR zzq8R7rzA8gOj?(g-VQfXJ<7StZ&bXnS-NMPIq zo?#ugt*ltZ))+3^#-lf_8V>`nm&o~+6SYEHQGuCH3e1AVQH9%;g$gg-EH5P`Kn9Z66n6cIUAN>db@Ld0gh``# z`7yj9C$D_cJj5M*)BzH**umNd3;-tiCsq&~;DR81^B@9Q(U!^$+G}uNQPuP}iE$sq z>m8A%avG=AQyIls&&A?2Xk0Oillt$%e;{UgssI20 diff --git a/mgwr/__pycache__/gwr.cpython-35.pyc b/mgwr/__pycache__/gwr.cpython-35.pyc deleted file mode 100644 index bbcda296211dd63230e54e50a192eaa1a4fc8ba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68258 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 GnSTSsj=L)W diff --git a/mgwr/__pycache__/search.cpython-35.pyc b/mgwr/__pycache__/search.cpython-35.pyc deleted file mode 100644 index 628d6d897ba26b0edbeba0315d9e6d36f866fed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6107 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 diff --git a/mgwr/__pycache__/sel_bw.cpython-35.pyc b/mgwr/__pycache__/sel_bw.cpython-35.pyc deleted file mode 100644 index f08932a218c537e524fc7bf1f8b1efa72be0cee5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16538 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 YQ?ZW1-9Cwsj`vCHCAjo7`A+Bl8wN%>+5i9m diff --git a/mgwr/__pycache__/summary.cpython-35.pyc b/mgwr/__pycache__/summary.cpython-35.pyc deleted file mode 100644 index 7c6554ac0ef809a453d980e80219999060ff14be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6505 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 x Date: Fri, 22 Jun 2018 12:27:49 -0700 Subject: [PATCH 6/7] aicc for global --- mgwr/summary.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mgwr/summary.py b/mgwr/summary.py index cb78d62..6c0ff5b 100644 --- a/mgwr/summary.py +++ b/mgwr/summary.py @@ -1,6 +1,7 @@ import numpy as np from spglm.family import Gaussian, Binomial, Poisson from spglm.glm import GLM +from .diagnostics import get_AICc def summaryModel(self): summary = '=' * 75 + '\n' @@ -21,7 +22,7 @@ def summaryGLM(self): summary += "%-62s %12.3f\n" % ('Residual sum of squares:', glm_rslt.deviance) summary += "%-62s %12.3f\n" % ('Log-likelihood:', glm_rslt.llf) summary += "%-62s %12.3f\n" % ('AIC:', glm_rslt.aic) - #summary += "%-62s %12.3f\n" % ('AICc:', glm_rslt.aicc) + summary += "%-62s %12.3f\n" % ('AICc:', get_AICc(glm_rslt)) summary += "%-62s %12.3f\n" % ('BIC:', glm_rslt.bic) summary += "%-62s %12.3f\n" % ('R2:', glm_rslt.D2) summary += "%-62s %12.3f\n\n" % ('Adj. R2:', glm_rslt.adj_D2) @@ -29,7 +30,7 @@ def summaryGLM(self): summary += "%-62s %12.3f\n" % ('Deviance:', glm_rslt.deviance) summary += "%-62s %12.3f\n" % ('Log-likelihood:', glm_rslt.llf) summary += "%-62s %12.3f\n" % ('AIC:', glm_rslt.aic) - #summary += "%-62s %12.3f\n" % ('AICc:', glm_rslt.aicc) + summary += "%-62s %12.3f\n" % ('AICc:', get_AICc(glm_rslt)) summary += "%-62s %12.3f\n" % ('BIC:', glm_rslt.bic) summary += "%-62s %12.3f\n" % ('Percent deviance explained:', glm_rslt.D2) summary += "%-62s %12.3f\n\n" % ('Adj. percent deviance explained:', glm_rslt.adj_D2) From 3eac546c2d072f1326c403572181f1affb417b9e Mon Sep 17 00:00:00 2001 From: Ziqi Li Date: Mon, 25 Jun 2018 11:05:05 -0700 Subject: [PATCH 7/7] add adj t and alpha for mgwr --- mgwr/summary.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mgwr/summary.py b/mgwr/summary.py index 6c0ff5b..c61efb9 100644 --- a/mgwr/summary.py +++ b/mgwr/summary.py @@ -80,7 +80,7 @@ def summaryGWR(self): summary += "%-62s %12.3f\n" % ('Adj. alpha (95%):', self.adj_alpha[1]) - summary += "%-62s %12.3f\n" % ('Adj. t-value(95%):', self.critical_tval(self.adj_alpha[1])) + summary += "%-62s %12.3f\n" % ('Adj. critical t value (95%):', self.critical_tval(self.adj_alpha[1])) summary += "\n%s\n" % ('Summary Statistics For GWR Parameter Estimates') summary += '-' * 75 + '\n' @@ -119,9 +119,9 @@ def summaryMGWR(self): summary += "%s\n" %('MGWR bandwidths') summary += '-' * 75 + '\n' - summary += "%-23s %30s %20s\n" % ('Variable', 'Optimal Bandwidth', 'ENP_j') + summary += "%-15s %14s %10s %16s %16s\n" % ('Variable', 'Bandwidth', 'ENP_j','Adj t-val(95%)','Adj alpha(95%)') for j in range(self.k): - summary += "%-23s %30.3f %20.3f\n" % (XNames[j], self.model.bw[j], self.ENP_j[j]) + summary += "%-14s %15.3f %10.3f %16.3f %16.3f\n" % (XNames[j], self.model.bw[j], self.ENP_j[j],self.critical_tval()[j],self.adj_alpha_j[j,1]) summary += "\n%s\n" % ('Diagnostic information') summary += '-' * 75 + '\n'