{"id":37,"date":"2018-05-18T20:36:03","date_gmt":"2018-05-19T00:36:03","guid":{"rendered":"http:\/\/sites.nd.edu\/miaoyang\/?page_id=37"},"modified":"2018-05-18T21:13:31","modified_gmt":"2018-05-19T01:13:31","slug":"r-program-for-ridge-gls-estimation","status":"publish","type":"page","link":"https:\/\/sites.nd.edu\/miaoyang\/software\/r-program-for-ridge-gls-estimation\/","title":{"rendered":"R program for ridge GLS estimation"},"content":{"rendered":"<p>This R program is for ridge GLS estimation as in the paper \u201cOptimizing Ridge Generalized Least Squares for Structural Equation Modeling.&#8221;<\/p>\n<p>Authors: Miao Yang and Ke-Hai Yuan<\/p>\n<p>&nbsp;<\/p>\n<p>#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n# R functions for ridge GLS estimation (don&#8217;t change codes in the functions)<br \/>\n#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n# Computing the value for the ridge tuning parameter<br \/>\na_pred&lt;-function(N,p,m,q,df,sk,kt){<br \/>\nm_sqrt &lt;- sqrt(m)<br \/>\nm_2 &lt;- m^2<br \/>\nm_log_N_2 &lt;- log(m)\/sqrt(N)<br \/>\nm_N &lt;- m\/N<br \/>\nq_log &lt;- log(q)<br \/>\nq_2_N &lt;- q^2\/(N)<br \/>\ndf_log &lt;- log(df)<br \/>\ndf_2 &lt;- df^2<br \/>\ndf_log_logN &lt;- log(df)\/log(N)<br \/>\ndf_log_N &lt;- log(df)\/(N)<br \/>\ndf_N &lt;- df\/N<br \/>\ndf_3_2_N &lt;- (df)^(3\/2.0)\/(N)<br \/>\nsk_3_2 &lt;- (sk)^(3\/2.0)<br \/>\nsk_N &lt;- sk\/N<br \/>\nkt_log &lt;- log(kt)<br \/>\nkt_log_logN &lt;- log(kt)\/log(N)<br \/>\nkt_sqrt_logN &lt;- sqrt(kt)\/log(N)<br \/>\nkt_log_N_2 &lt;- log(kt)\/sqrt(N)<br \/>\nkt_log_N &lt;- log(kt)\/(N)<br \/>\nkt_sqrt_N &lt;- sqrt(kt)\/(N)<\/p>\n<p>cb= -25.5726+0.0006*N-1.9260*m_sqrt-0.0049*m_2+24.2975*m_log_N_2-28.7679*m_N-<br \/>\n0.0331*q_log+0.0044*q_2_N+2.2866*df_log-(9.490000e-08)*df_2+8.3315*df_log_logN+<br \/>\n11.8695*df_log_N-0.0045*df_N-0.0010*df_3_2_N+0.0070*sk_3_2-732.8503*sk_N+<br \/>\n5.8133*kt_log+73.4353*kt_log_logN+0.0150*kt_sqrt_logN+192.3647*kt_log_N_2+<br \/>\n378.9057*kt_log_N+760.7915*kt_sqrt_N<br \/>\npi &lt;- exp(cb)\/(1+exp(cb))<\/p>\n<p>if (pi&gt;0.5) {<br \/>\na &lt;- 0.05<br \/>\n}else if (pi&lt;0.5){<br \/>\ny &lt;- 2.7380-3.9151*log(df)\/log(N)-3.1905*log(kt)+6.9506*kt^2\/sqrt(N)<br \/>\na &lt;- exp(y)\/(1+exp(y))<br \/>\n}<\/p>\n<p>return(a)<br \/>\n}<\/p>\n<p># Computing relative multivariate skewness and kurtosis<br \/>\nMardia.tran1 &lt;- function(x){<br \/>\nn &lt;- nrow(x)<br \/>\np &lt;- ncol(x)<br \/>\nx.c &lt;- x-matrix(apply(x,2,mean),nrow=n,ncol=p,byrow=T)<\/p>\n<p>S &lt;- cov(x)*(n-1)\/n<br \/>\nS_inv &lt;- solve(S)<br \/>\nD &lt;- as.matrix(x.c)%*%S_inv%*%t(x.c)<\/p>\n<p>b1 &lt;- sum(D^3)<br \/>\nb2 &lt;- sum(diag(D^2))\/n #Mardia&#8217;s kurtosis<\/p>\n<p>df &lt;- p*(p+1)*(p+2)<br \/>\nsk &lt;- b1\/(n*df)<br \/>\nkt &lt;- b2\/(p*(p+2))<\/p>\n<p>return(list(&#8216;skew&#8217;=sk,&#8217;kurt&#8217;=kt))<br \/>\n}<\/p>\n<p># The following is to produce the matrix Gamma (Sy)<br \/>\nSy &lt;- function(n,p,x){<br \/>\nps &lt;- p*(p+1)\/2<br \/>\nmean_xt &lt;- apply(x,2,mean)<br \/>\ny &lt;- matrix(0,n,ps)<br \/>\nx_c &lt;- x-matrix(1,n,1)%*%mean_xt<br \/>\nx_ct &lt;- t(x_c)<br \/>\nScov &lt;- x_ct %*% x_c \/n<br \/>\nvscov &lt;- matrixcalc::vech(Scov)<br \/>\nfor (i in 1:n){<br \/>\nl &lt;- 0<br \/>\nfor (j in 1:p){<br \/>\nfor (k in j:p){<br \/>\nl &lt;- l+1<br \/>\ny[i,l] &lt;- x_c[i,k]*x_c[i,j]<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\nvscov_t &lt;- t(vscov)<br \/>\ny &lt;- y-matrix(1,n,1)%*%vscov_t # dim: n by p(p+1)\/2<br \/>\nS_y &lt;- t(y)%*%y\/n<br \/>\nout &lt;- list(&#8216;S_y&#8217;=S_y, &#8216;vscov&#8217;=vscov, &#8216;Scov&#8217;=Scov)<br \/>\nreturn(out)<br \/>\n}<\/p>\n<p># Evaluate structured sigma and (dsigma\/dtheta) for CFA models (needs modification if other models are used)<br \/>\nsigdsig &lt;- function(p,m,theta0){<br \/>\nps &lt;- p*(p+1)\/2<br \/>\np_h &lt;- p\/m<br \/>\np2 &lt;- p*2<br \/>\nlamb &lt;- matrix(0,p,m)<br \/>\nfor (j in 1:m){<br \/>\np_hj &lt;- (j-1)*p_h+1<br \/>\np_hj1 &lt;- j*p_h<br \/>\nlamb[p_hj:p_hj1,j] &lt;- theta0[p_hj:p_hj1]<br \/>\n}<\/p>\n<p>psi_vec &lt;- theta0[(p+1):p2]<br \/>\nphi &lt;- matrix(1,m,m)<br \/>\nk &lt;- 0<br \/>\nfor (i in 1:(m-1)){<br \/>\nfor (j in (i+1):m){<br \/>\nk &lt;- k+1<br \/>\nphi[j,i] &lt;- theta0[p2+k]<br \/>\nphi[i,j] &lt;- theta0[p2+k]<br \/>\n}<br \/>\n}<br \/>\nSigma0 &lt;- lamb%*%phi%*%t(lamb) + diag(psi_vec)<\/p>\n<p># The following is to evaluate (dSigma0\/dtheta)<br \/>\n# DL is the derivative with Lambda<br \/>\nDL &lt;- matrix(0,ps,p)<br \/>\nlambphi &lt;- lamb%*%phi<br \/>\nlambphi_t &lt;- t(lambphi)<br \/>\nfor (j in 1:m){<br \/>\np_hj &lt;- (j-1)*p_h+1<br \/>\np_hj1 &lt;- j*p_h<br \/>\nfor (k in p_hj:p_hj1){<br \/>\ntt &lt;- matrix(0,p,m)<br \/>\ntt[k,j] &lt;- 1<br \/>\nttt &lt;- tt%*%lambphi_t+lambphi%*%t(tt)<br \/>\nDL[,k] &lt;- matrixcalc::vech(ttt)<br \/>\n}<br \/>\n}<br \/>\n#Dps is the derivative with Psi<br \/>\nDps &lt;- matrix(0,ps,p)<br \/>\nfor (j in 1:p){<br \/>\ntt &lt;- matrix(0,p,p)<br \/>\ntt[j,j] &lt;- 1<br \/>\nDps[,j] &lt;- matrixcalc::vech(tt)<br \/>\n}<br \/>\n#Dphi is the derivative with phi<br \/>\nms &lt;- m*(m-1)\/2<br \/>\nDphi &lt;- matrix(0,ps,ms)<br \/>\nk &lt;- 0<br \/>\nfor (i in 1:(m-1)){<br \/>\nfor (j in (i+1):m){<br \/>\nk &lt;- k+1<br \/>\ntt &lt;- matrix(0,m,m)<br \/>\ntt[j,i] &lt;- 1 ; tt[i,j] &lt;- 1<br \/>\nttt &lt;- lamb%*%tt%*%t(lamb)<br \/>\nDphi[,k] &lt;- matrixcalc::vech(ttt)<br \/>\n}<br \/>\n}<br \/>\nvdsig &lt;- cbind(DL,Dps,Dphi)<br \/>\nout &lt;- list(&#8216;Sigma0&#8217;=Sigma0, &#8216;vdsig&#8217;=vdsig)<br \/>\nreturn(out)<br \/>\n}<\/p>\n<p># minimize Ridge GLS\/ADF using Fisher-scoring<br \/>\nminGLS &lt;- function(n,p,m,theta0){<br \/>\nrequire(lavaan)<br \/>\nrequire(MASS)<br \/>\nrequire(matrixcalc)<\/p>\n<p>run.Sy &lt;- Sy(n,p,x=as.matrix(variables))<br \/>\nS_y &lt;- run.Sy$S_y<br \/>\nvscov &lt;- run.Sy$vscov<br \/>\nweight &lt;- a*S_y +(1-a)*diag(ps)<\/p>\n<p>ep &lt;- 0.0001<br \/>\nps &lt;- p*(p+1)\/2<br \/>\nq &lt;- length(theta0)<br \/>\ndf &lt;- ps-q<br \/>\ndiverg &lt;- 1<br \/>\nestimate_GLS &lt;- NA<br \/>\ntest_GLS &lt;- NA<br \/>\ndelta &lt;- 0.1<br \/>\nfor(i in 1:300){<br \/>\nsig &lt;- sigdsig(p,m, theta0) # gives a list of 2: sig$Sigma0; sig$vdsig<br \/>\nvsig0 &lt;- matrixcalc::vech(sig$Sigma0)<br \/>\ndswe &lt;- t(sig$vdsig) %*% weight<br \/>\ndwd &lt;- dswe %*% sig$vdsig<br \/>\nstdi &lt;- try(solve(dwd),silent=T)<br \/>\nif(is.character(stdi)){<br \/>\ndiverg &lt;- 1 # not converge<br \/>\nreturn(list(test_GLS=NA, estimate_GLS=NA, diverg=diverg))<br \/>\n}<br \/>\neresdu &lt;- vscov-vsig0<br \/>\ndtheta &lt;- stdi %*% dswe %*% eresdu<br \/>\ntheta0 &lt;- theta0 + dtheta<br \/>\ndelta &lt;- max(abs(dtheta))<br \/>\nif(delta&lt;=ep) break;<br \/>\n}<br \/>\nif(i&lt;300){<br \/>\ndiverg &lt;- 0 #converge within 300 iteration<br \/>\n# Test start here;<br \/>\nf_rGLS &lt;- t(eresdu) %*% weight %*% eresdu<br \/>\nT_GLS &lt;- (n-1)*f_rGLS<br \/>\nVar &lt;- stdi %*%dswe %*%S_y %*%t(dswe) %*%stdi<br \/>\nSE &lt;- sqrt(diag(Var)\/(n-1))<br \/>\n# print(&#8220;theta_rGLS&#8211;SE_rGLS=&#8221;)<br \/>\nVmat &lt;- weight-t(dswe)%*%stdi%*%dswe<br \/>\nVS_y &lt;- Vmat %*% S_y<br \/>\ntVS_y &lt;- sum(diag(VS_y))<\/p>\n<p>VS_y2 &lt;- VS_y %*% VS_y<br \/>\ntVS_y2 &lt;- sum(diag(VS_y2))<br \/>\ncst &lt;- tVS_y\/df<br \/>\nT_GLS1 &lt;- T_GLS\/cst<br \/>\n# pra1 &lt;- 1-pchisq(T_GLS1,df)<br \/>\ncst_1 &lt;- tVS_y2\/tVS_y<br \/>\ncst_2 &lt;- (tVS_y*tVS_y)\/tVS_y2<br \/>\nT_GLS2 &lt;- T_GLS\/cst_1<br \/>\ntest_GLS &lt;- cbind(T_GLS,T_GLS1,T_GLS2)<br \/>\nestimate_GLS &lt;- cbind(theta0,SE)<\/p>\n<p>}<br \/>\ncolnames(test_GLS)&lt;-c(&#8220;T&#8221;,&#8221;T_rescaled&#8221;,&#8221;T_adjusted&#8221;)<br \/>\nreturn(list(test_GLS=test_GLS, estimate_GLS=estimate_GLS, diverg=diverg))<br \/>\n}<\/p>\n<p>#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n# Codes that need user&#8217;s modification<br \/>\n#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>data(HolzingerSwineford1939) # a dataset for illustration<br \/>\nvariables &lt;- HolzingerSwineford1939[,7:15]<br \/>\nn &lt;- nrow(variables) # sample size<br \/>\np &lt;- ncol(variables) # number of variables<br \/>\nm &lt;- 3 # number of latent factors<br \/>\nq &lt;- 2*p+m*(m-1)\/2 # number of parameters<br \/>\nps &lt;- p*(p+1)\/2<br \/>\ndf &lt;- ps-q # degrees of freedom<br \/>\nsk &lt;- Mardia.tran1(variables)$skew #skewness<br \/>\nkt &lt;- Mardia.tran1(variables)$kurt #kurtorsis<br \/>\na &lt;- a_pred(N=n,p,m,q,df,sk,kt) #predicted value for the optimal ridge tuning paramter<\/p>\n<p>theta0 &lt;- rep(1,q) #starting values<\/p>\n<p>minGLS(n,p,m,theta0) # output includes a list of test statistics,<br \/>\n# parameter estimates by ridge GLS and the corresponding SEs,<br \/>\n# and whether converged or not (diverge=0 means converged)<\/p>\n<p>&nbsp;<\/p>\n<p><audio controls=\"controls\"><\/audio><\/p>\n<p><audio controls=\"controls\"><\/audio><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This R program is for ridge GLS estimation as in the paper \u201cOptimizing Ridge Generalized Least Squares for Structural Equation Modeling.&#8221; Authors: Miao Yang and Ke-Hai Yuan &nbsp; #&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; # R functions for ridge GLS estimation (don&#8217;t change codes in the functions) #&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; # Computing the value for the ridge tuning parameter a_pred&lt;-function(N,p,m,q,df,sk,kt){ m_sqrt &lt;- [&hellip;]<\/p>\n","protected":false},"author":2828,"featured_media":0,"parent":16,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-37","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/pages\/37","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/users\/2828"}],"replies":[{"embeddable":true,"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/comments?post=37"}],"version-history":[{"count":7,"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/pages\/37\/revisions"}],"predecessor-version":[{"id":53,"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/pages\/37\/revisions\/53"}],"up":[{"embeddable":true,"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/pages\/16"}],"wp:attachment":[{"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/media?parent=37"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}