{"id":40,"date":"2018-05-18T20:37:19","date_gmt":"2018-05-19T00:37:19","guid":{"rendered":"http:\/\/sites.nd.edu\/miaoyang\/?page_id=40"},"modified":"2018-05-18T20:48:19","modified_gmt":"2018-05-19T00:48:19","slug":"r-program-for-robust-moderation-analysis","status":"publish","type":"page","link":"https:\/\/sites.nd.edu\/miaoyang\/software\/r-program-for-robust-moderation-analysis\/","title":{"rendered":"R program for robust moderation analysis"},"content":{"rendered":"<header class=\"entry-header\">\n<h1 class=\"entry-title\"><\/h1>\n<\/header>\n<div class=\"entry-content\">\n<p>This R program is for performing robust moderation\/interaction analysis using a two-level regression\u00a0model as proposed in the paper \u201cRobust methods for moderation analysis with a two-level regression model\u201d.\u00a0Robustness is achieved using Student\u2019s t distribution and Huber-type weights.<\/p>\n<p>For citation of the paper, please consider<\/p>\n<p>Yang, M<strong>.<\/strong>, &amp; Yuan, K.-H. (2016). Robust methods for moderation analysis with a two-level regression model.\u00a0<em>Multivariate Behavioral Research<\/em>,\u00a0<em>51<\/em>(6), 757-771.<\/p>\n<p>##=======================================##<br \/>\n## A simulated data set with 500 cases ##<br \/>\n##=======================================##<br \/>\nset.seed(1113)<br \/>\nDV &lt;- rt(500,5) # the dependent variable<br \/>\nIV &lt;- rnorm(500) # the independent variable<br \/>\nModerator &lt;- runif(500,1,10) #the moderator<br \/>\ndata &lt;- cbind(DV,IV,Moderator)<br \/>\nwrite.table(data,\u2019simdata.txt\u2019,row.names=F)<\/p>\n<p>##==================##<br \/>\n## NML estimation ##<br \/>\n##==================##<br \/>\nrequire(MASS)<br \/>\nNML&lt;-function(y,x,z){<br \/>\nparam.names &lt;- as.list(match.call()[-1])<\/p>\n<p>n &lt;- length(y)<br \/>\nh &lt;- cbind(x^2,2*x,rep(1,n))<br \/>\nC &lt;- cbind(rep(1,n),z,x,x*z)<\/p>\n<p>LS.MMR&lt;-lm(y~x*z)<br \/>\nr00&lt;-LS.MMR$coefficients[1]<br \/>\nr01&lt;-LS.MMR$coefficients[3]<br \/>\nr10&lt;-LS.MMR$coefficients[2]<br \/>\nr11&lt;-LS.MMR$coefficients[4]<br \/>\ngamma.start &lt;- as.matrix(c(r00,r01,r10,r11))<br \/>\nsigma.start &lt;- c(1,0,1)<\/p>\n<p>for (iter in 1:500) {<\/p>\n<p>tau2&lt;-h%*%sigma.start<\/p>\n<p>A&lt;-diag(as.vector(1\/tau2))<br \/>\nB&lt;-diag(as.vector(1\/tau2^2))<\/p>\n<p>gamma&lt;-ginv(t(C)%*%A%*%C)%*%(t(C)%*%A%*%y)<br \/>\ndelta2&lt;-(y-C%*%gamma)^2<br \/>\nsigma&lt;-ginv(t(h)%*%B%*%h)%*%(t(h)%*%B%*%delta2)<\/p>\n<p>diff&lt;-sum(abs(gamma-gamma.start))+sum(abs(sigma-sigma.start))<\/p>\n<p>gamma.start&lt;-gamma<br \/>\nsigma.start&lt;-sigma<\/p>\n<p>if (diff&lt;1.0E-12) {<br \/>\nconv&lt;-1<br \/>\nbreak<br \/>\n}<br \/>\n}<\/p>\n<p>tau2&lt;-h%*%sigma<br \/>\ndelta2&lt;-(y-C%*%gamma)^2<br \/>\ndelta&lt;-y-C%*%gamma<\/p>\n<p>#BIC<br \/>\nk &lt;-length(gamma)+length(sigma)<br \/>\nBIC &lt;- n*log(2*pi) + sum(log(tau2)) + sum((delta2)\/tau2) + k*log(n)<\/p>\n<p>#Sandwich SE<br \/>\nU11&lt;-t(C)%*%diag(as.vector(1\/tau2))%*%C; U12&lt;-t(C)%*%diag(as.vector(delta\/tau2^2))%*%h<br \/>\nU21&lt;-t(U12); U22&lt;-t(h)%*%diag(as.vector((2*delta2-tau2)\/(2*tau2^3)))%*%h<\/p>\n<p>V11&lt;-t(C)%*%diag(as.vector(delta2\/tau2^2))%*%C;<br \/>\nV12&lt;-t(C)%*%diag(as.vector((delta^3-delta*tau2)\/(2*tau2^3)))%*%h;<br \/>\nV21&lt;-t(V12); V22&lt;-t(h)%*%diag(as.vector((delta2-tau2)^2\/(4*tau2^4)))%*%h<\/p>\n<p>U&lt;-rbind(cbind(U11,U12),cbind(U21,U22))<br \/>\nV&lt;-rbind(cbind(V11,V12),cbind(V21,V22))<br \/>\nCov&lt;-ginv(U)%*%V%*%ginv(U)<br \/>\nse.theta&lt;-sqrt(diag(Cov))<\/p>\n<p>theta&lt;-c(gamma,sigma)<br \/>\nz&lt;-theta\/se.theta<br \/>\np&lt;-2*pnorm(-abs(z))<br \/>\nR.square&lt;-(gamma[4])^2*var(z)\/((gamma[4])^2*var(z)+sigma[1])<\/p>\n<p>out&lt;-NULL<\/p>\n<p>Parameter &lt;- cbind(theta,se.theta,z,p)[1:4,]<br \/>\nrownames(Parameter) &lt;- c(\u201cIntercept\u201d,param.names[3:2],paste(param.names[2],param.names[3],sep=\u201d*\u201d))<br \/>\ncolnames(Parameter) &lt;- c(\u201cEstimate\u201d,\u201dSE_sw\u201d,\u201dz\u201d,\u201dPr(&gt;|z|)\u201d)<br \/>\nout &lt;- list(Parameter=Parameter,BIC=BIC,R.square=R.square)<br \/>\nreturn(out)<br \/>\n}<\/p>\n<p>##============================================##<br \/>\n## Robust estimation based on Student\u2019s distribution\u00a0 \u00a0 \u00a0 ##<br \/>\n##============================================##<\/p>\n<p>TML&lt;-function(y,x,z,m=5){<br \/>\nparam.names &lt;- as.list(match.call()[-1])<\/p>\n<p>n &lt;- length(y)<br \/>\nh &lt;- cbind(x^2,2*x,rep(1,n))<br \/>\nC &lt;- cbind(rep(1,n),z,x,x*z)<\/p>\n<p>LS.MMR&lt;-lm(y~x*z)<br \/>\nr00&lt;-LS.MMR$coefficients[1]<br \/>\nr01&lt;-LS.MMR$coefficients[3]<br \/>\nr10&lt;-LS.MMR$coefficients[2]<br \/>\nr11&lt;-LS.MMR$coefficients[4]<br \/>\ngamma.start &lt;- as.matrix(c(r00,r01,r10,r11))<br \/>\nsigma.start &lt;- c(1,0,1)<\/p>\n<p>for (iter in 1:500) {<\/p>\n<p>delta&lt;-y-C%*%gamma.start<br \/>\ntau2&lt;-h%*%sigma.start*(m-2)\/m<\/p>\n<p>di2&lt;-delta^2\/tau2<br \/>\nwi&lt;-(m+1)\/(m+di2)<\/p>\n<p>d&lt;-as.matrix(di2)<br \/>\nA&lt;-diag(as.vector(wi\/tau2))<br \/>\nB&lt;-diag(as.vector(1\/tau2^2))<\/p>\n<p>gamma&lt;-ginv(t(C)%*%A%*%C)%*%(t(C)%*%A%*%y)<br \/>\nsigma&lt;-ginv(t(h)%*%B%*%h)%*%(t(h)%*%A%*%d)*m\/(m-2)<\/p>\n<p>diff&lt;-sum(abs(gamma-gamma.start))+sum(abs(sigma-sigma.start))<\/p>\n<p>gamma.start&lt;-gamma<br \/>\nsigma.start&lt;-sigma<\/p>\n<p>if (diff&lt;1.0E-12) {<br \/>\nconv&lt;-1<br \/>\nbreak<br \/>\n}<\/p>\n<p>}<\/p>\n<p>delta&lt;-y-C%*%gamma.start;<br \/>\ndelta2&lt;-(y-C%*%gamma.start)^2;<br \/>\ntau2&lt;-h%*%sigma.start*(m-2)\/m;<br \/>\nd&lt;-as.matrix(delta2\/tau2)<br \/>\ndi2&lt;-delta^2\/tau2<br \/>\nwi&lt;-(m+1)\/(m+di2)<\/p>\n<p>#BIC<br \/>\nk &lt;-length(gamma)+length(sigma)<br \/>\nBIC &lt;- 2*n*log(sqrt(m*pi)*gamma(m\/2)\/gamma(m\/2+0.5)) + sum(log(tau2)) + (m+1)*sum(log(1+d\/m)) + k*log(n)<\/p>\n<p>#Sandwich SE<br \/>\nU11.part&lt;-diag(as.vector((m-d)*wi\/((d+m)*tau2))) #d is di^2<br \/>\nU12.part&lt;-diag(as.vector((m-2)*wi*delta\/((d+m)*tau2^2)))<br \/>\nU21.part&lt;-U12.part<br \/>\nU22.part&lt;-diag(as.vector(0.5*(1-2\/m)^2*((d+2*m)\/(d+m)*wi*d-1)\/tau2^2))<br \/>\nV11.part&lt;-diag(as.vector(wi^2*d\/tau2))<br \/>\nV12.part&lt;-diag(as.vector((m-2)*(wi*d-1)*wi*delta\/(2*m*tau2^2)))<br \/>\nV21.part&lt;-V12.part<br \/>\nV22.part&lt;-diag(as.vector((m-2)^2*(wi*d-1)^2\/(4*m^2*tau2^2)))<br \/>\nU11&lt;-t(C)%*%U11.part%*%C; U12&lt;-t(C)%*%U12.part%*%h; U21&lt;-t(U12); U22&lt;-t(h)%*%U22.part%*%h<br \/>\nV11&lt;-t(C)%*%V11.part%*%C; V12&lt;-t(C)%*%V12.part%*%h; V21&lt;-t(V12); V22&lt;-t(h)%*%V22.part%*%h<\/p>\n<p>U&lt;-rbind(cbind(U11,U12),cbind(U21,U22))<br \/>\nV&lt;-rbind(cbind(V11,V12),cbind(V21,V22))<br \/>\nCov&lt;-ginv(U)%*%V%*%ginv(U)<br \/>\nse.theta&lt;-sqrt(diag(Cov))<\/p>\n<p>theta&lt;-c(gamma,sigma)<br \/>\nz&lt;-theta\/se.theta<br \/>\np&lt;-2*pnorm(-abs(z))<br \/>\nR.square&lt;-(gamma[4])^2*var(z)\/((gamma[4])^2*var(z)+sigma[1])<\/p>\n<p>out&lt;-NULL<\/p>\n<p>Parameter &lt;- cbind(theta,se.theta,z,p)[1:4,]<br \/>\nrownames(Parameter) &lt;- c(\u201cIntercept\u201d,param.names[3:2],paste(param.names[2],param.names[3],sep=\u201d*\u201d))<br \/>\ncolnames(Parameter) &lt;- c(\u201cEstimate\u201d,\u201dSE_sw\u201d,\u201dz\u201d,\u201dPr(&gt;|z|)\u201d)<br \/>\nout &lt;- list(Parameter=Parameter,BIC=BIC,R.square=R.square)<br \/>\nreturn(out)<br \/>\n}<\/p>\n<p>##============================================##<br \/>\n## Robust estimation based on Huber-type weights\u00a0 \u00a0 \u00a0 \u00a0 \u00a0##<br \/>\n##============================================##<\/p>\n<p>Huber&lt;-function(y,x,z,alpha=0.95){<\/p>\n<p>param.names &lt;- as.list(match.call()[-1])<\/p>\n<p>n &lt;- length(y)<br \/>\nh &lt;- cbind(x^2,2*x,rep(1,n))<br \/>\nC &lt;- cbind(rep(1,n),z,x,x*z)<\/p>\n<p>LS.MMR&lt;-lm(y~x*z)<br \/>\nr00&lt;-LS.MMR$coefficients[1]<br \/>\nr01&lt;-LS.MMR$coefficients[3]<br \/>\nr10&lt;-LS.MMR$coefficients[2]<br \/>\nr11&lt;-LS.MMR$coefficients[4]<br \/>\ngamma.start &lt;- as.matrix(c(r00,r01,r10,r11))<br \/>\nsigma.start &lt;- c(1,0,1)<\/p>\n<p>H2&lt;-qchisq(1-alpha,1)<br \/>\nH&lt;-sqrt(H2)<br \/>\nkappa=pchisq(H2,3)+H2*alpha<br \/>\nq=(H^2\/kappa-1)\/2<\/p>\n<p>for (iter in 1:500) {<\/p>\n<p>delta&lt;-y-C%*%gamma.start<br \/>\ntau2&lt;-h%*%sigma.start<br \/>\ntau2[tau2&lt;=0]&lt;-0.0001<\/p>\n<p>di&lt;-delta\/sqrt(tau2)<br \/>\nwi&lt;- ifelse(abs(di)&lt;H,1,H\/abs(di))<br \/>\nwi2 &lt;- (wi^2)\/kappa<\/p>\n<p>d&lt;-as.matrix(di^2)<br \/>\nA&lt;-diag(as.vector(wi\/tau2))<br \/>\nA2 &lt;- diag(as.vector(wi2\/tau2))<br \/>\nB&lt;-diag(as.vector(1\/tau2^2))<\/p>\n<p>gamma&lt;-ginv(t(C)%*%A%*%C)%*%(t(C)%*%A%*%y)<br \/>\nsigma&lt;-ginv(t(h)%*%B%*%h)%*%(t(h)%*%A2%*%d)<\/p>\n<p>diff&lt;-sum(abs(gamma-gamma.start))+sum(abs(sigma-sigma.start))<\/p>\n<p>gamma.start&lt;-gamma<br \/>\nsigma.start&lt;-sigma<\/p>\n<p>if (diff&lt;1.0E-12) {<br \/>\nconv&lt;-1<br \/>\nbreak<br \/>\n}<\/p>\n<p>}<\/p>\n<p>tau2&lt;-h%*%sigma; delta2&lt;-(y-C%*%gamma)^2; delta&lt;-y-C%*%gamma; di&lt;-delta\/sqrt(tau2)<br \/>\nwi&lt;- ifelse(abs(di)&lt;H,1,H\/abs(di))<br \/>\nwi2 &lt;- (wi^2)\/kappa<\/p>\n<p>tau&lt;-sqrt(tau2)<br \/>\ndi&lt;-delta\/tau<\/p>\n<p>#Sandwich SE<br \/>\nU11.part&lt;-ifelse(abs(di)&lt;=H, 1\/tau2, 0)<br \/>\nU12.part&lt;-ifelse(abs(di)&lt;=H, delta\/tau2^2, H*sign(di)\/(2*tau^3))<br \/>\nU21.part&lt;-ifelse(abs(di)&lt;=H, delta\/kappa\/tau2^2, 0)<br \/>\nU22.part&lt;-ifelse(abs(di)&lt;=H, delta2\/kappa\/tau2^3-1\/(2*tau2^2), q\/(tau2^2))<\/p>\n<p>V11.part&lt;-ifelse(abs(di)&lt;=H, delta2\/tau2^2,H^2\/tau2)<br \/>\nV12.part&lt;-ifelse(abs(di)&lt;=H, (delta^3\/kappa-delta*tau2)\/(2*tau2^3),q*H*sign(di)\/(tau^3))<br \/>\nV22.part&lt;-ifelse(abs(di)&lt;=H, (delta2\/kappa-tau2)^2\/(4*tau2^4),(q^2)\/(tau2^2))<\/p>\n<p>U11&lt;-t(C)%*%diag(as.vector(U11.part))%*%C;<br \/>\nU12&lt;-t(C)%*%diag(as.vector(U12.part))%*%h<br \/>\nU21&lt;-t(h)%*%diag(as.vector(U21.part))%*%C;<br \/>\nU22&lt;-t(h)%*%diag(as.vector(U22.part))%*%h<\/p>\n<p>V11&lt;-t(C)%*%diag(as.vector(V11.part))%*%C; V12&lt;-t(C)%*%diag(as.vector(V12.part))%*%h<br \/>\nV21&lt;-t(V12); V22&lt;-t(h)%*%diag(as.vector(V22.part))%*%h<\/p>\n<p>U&lt;-rbind(cbind(U11,U12),cbind(U21,U22))<br \/>\nV&lt;-rbind(cbind(V11,V12),cbind(V21,V22))<br \/>\nCov&lt;-ginv(U)%*%V%*%ginv(t(U))<br \/>\nse.theta&lt;-sqrt(diag(Cov))<\/p>\n<p>theta&lt;-c(gamma,sigma)<br \/>\nz&lt;-theta\/se.theta<br \/>\np&lt;-2*pnorm(-abs(z))<br \/>\nR.square&lt;-(gamma[4])^2*var(z)\/((gamma[4])^2*var(z)+sigma[1])<\/p>\n<p>out&lt;-NULL<\/p>\n<p>Parameter &lt;- cbind(theta,se.theta,z,p)[1:4,]<br \/>\nrownames(Parameter) &lt;- c(\u201cIntercept\u201d,param.names[3:2],paste(param.names[2],param.names[3],sep=\u201d*\u201d))<br \/>\ncolnames(Parameter) &lt;- c(\u201cEstimate\u201d,\u201dSE_sw\u201d,\u201dz\u201d,\u201dPr(&gt;|z|)\u201d)<br \/>\nout &lt;- list(Parameter=Parameter,BIC=NA,R.square=R.square)<br \/>\nreturn(out)<br \/>\n}<\/p>\n<p>##========================================##<br \/>\n## Code that needs user\u2019s modification ##<br \/>\n##========================================##<br \/>\nsetwd(\u201cc:\/moderation\u201d) #set working directory<br \/>\ndata &lt;- read.table(\u2018simdata.txt\u2019,header=T) #read data<br \/>\ny &lt;- data$DV<br \/>\nx &lt;- data$IV<br \/>\nz &lt;- data$Moderator<br \/>\nNML(y,x,z)<br \/>\nTML(y,x,z,m=5)<br \/>\nHuber(y,x,z,alpha=.05)<\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><audio controls=\"controls\"><\/audio><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This R program is for performing robust moderation\/interaction analysis using a two-level regression\u00a0model as proposed in the paper \u201cRobust methods for moderation analysis with a two-level regression model\u201d.\u00a0Robustness is achieved using Student\u2019s t distribution and Huber-type weights. For citation of the paper, please consider Yang, M., &amp; Yuan, K.-H. (2016). Robust methods for moderation analysis [&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-40","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/pages\/40","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=40"}],"version-history":[{"count":5,"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/pages\/40\/revisions"}],"predecessor-version":[{"id":48,"href":"https:\/\/sites.nd.edu\/miaoyang\/wp-json\/wp\/v2\/pages\/40\/revisions\/48"}],"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=40"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}