I have the following code for a multivariate GMM. When I run it, it gives an error. Any advice or guidance would be appreciated.
proc iml; NOTE: IML Ready 80 use WORK.IMPORT4; 81 read all var {X1 X2} into x; 81 ! /* Read multiple variables x1 and x2 */ 82 83 mu = {120 150}; 83 ! /* Mean vector */ 84 si = {20 20}; 84 ! /* Standard deviation vector */ 85 pi = {0.5 0.5}; 85 ! /* Mixing weights */ 86 87 nVars = ncol(x); 87 ! /* Number of variables */ 88 nClusters = nrow(mu); 88 ! /* Number of clusters */ 89 90 /* Estep */ 91 stop = 0; 92 results = j(1, 1 + nClusters + nClusters*nVars + nClusters*nVars, .); 93 idx = 1; 94 do i = 1 to 200 while (stop = 0); 95 print "Iteration" i; 96 97 /* Compute gamma */ 98 gamma = pi[1] * pdf('normal', x, mu[1], si[1]) + 99 pi[2] * pdf('normal', x, mu[2], si[2]); 100 gamma = gamma / (gamma[,1] + gamma[,2]); 100 ! /* Normalize gamma */ 101 102 /* Check for convergence */ 103 if i = 1 then print gamma; 104 105 nk = gamma[,1] + gamma[,2]; 105 ! /* Calculate nk */ 106 107 npi = nk / sum(nk); 107 ! /* Calculate npi */ 108 109 nmu = j(1, nVars, 0); 110 do k = 1 to nClusters; 111 nmu = nmu + (gamma[,k] # x[,1:nVars]); 112 end; 113 nmu = nmu / nk; 113 ! /* Calculate nmu */ 114 115 nsi2 = j(nVars, nVars, 0); 116 116 ! do k = 1 to nClusters; 117 117 ! diff = x[,1:nVars] - nmu; 118 118 ! nsi2 = nsi2 + (gamma[,k] * (diff` * diff)); 119 119 ! end; 120 121 nsi = sqrt(nsi2); 121 ! /* Calculate nsi */ 122 123 diff = max(abs(mu - nmu)); 123 ! /* Calculate diff */ 124 125 if diff < 0.005 then stop = 1; 126 127 mu = nmu; 127 ! /* Update mu */ 128 si = nsi; 128 ! /* Update si */ 129 pi = npi; 129 ! /* Update pi */ 130 131 results[idx, 1] = i; 132 results[idx, 2:(1+nClusters)] = npi; 133 results[idx, (2+nClusters):(1+nClusters+nVars)] = nmu; 134 results[idx, (2+nClusters+nVars):(1+nClusters+2*nVars)] = nsi; 135 idx = idx + 1; 136 end; ERROR: (execution) Matrices do not conform to the operation. operation : * at line 118 column 31 operands : _TEM1001, _TEM1003 _TEM1001 1500 rows 1 col (numeric) _TEM1003 2 rows 2 cols (numeric) 5054876.6 5443147.7 5443147.7 6657773.5 statement : ASSIGN at line 118 column 6 137 138 create results from results; 139 append from results; 140 close results; NOTE: The data set WORK.RESULTS has 1 observations and 6 variables. 141 142 quit;
Are you trying to fit a Gaussian mixture model to data by using the EM algorithm? If so, try
nClusters = NCOL(mu);
also, see the IML program and discussion at
https://blogs.sas.com/content/iml/2020/07/23/fit-multivariate-gaussian-mixture-em-algorithm.html
Are you trying to fit a Gaussian mixture model to data by using the EM algorithm? If so, try
nClusters = NCOL(mu);
also, see the IML program and discussion at
https://blogs.sas.com/content/iml/2020/07/23/fit-multivariate-gaussian-mixture-em-algorithm.html
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.
Find more tutorials on the SAS Users YouTube channel.