⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcmcfactanal.cc

📁 使用R语言的马尔科夫链蒙特卡洛模拟(MCMC)源代码程序。
💻 CC
字号:
// MCMCfactanal.cc is C++ code to estimate a factor analysis model//// Andrew D. Martin// Dept. of Political Science// Washington University in St. Louis// admartin@wustl.edu//// Kevin M. Quinn// Dept. of Government// Harvard University// kevin_quinn@harvard.edu// // This software is distributed under the terms of the GNU GENERAL// PUBLIC LICENSE Version 2, June 1991.  See the package LICENSE// file for more information.//// Copyright (C) 2004 Andrew D. Martin and Kevin M. Quinn// // revised version of older MCMCfactanal 5/11/2004 KQ// updated to new verion of scythe 7/25/2004 ADM// updated to Scythe 1.0.X 7/10/2007 ADM// finished update to Scythe 1.0.X 7/30/2007 KQ//#ifndef MCMCFACTANAL_CC#define MCMCFACTANAL_CC#include "matrix.h"#include "algorithm.h"#include "distributions.h"#include "stat.h"#include "la.h"#include "ide.h"#include "smath.h"#include "MCMCrng.h"#include "MCMCfcds.h"#include <R.h>           // needed to use Rprintf()#include <R_ext/Utils.h> // needed to allow user interruptstypedef Matrix<double,Row,View> rmview;using namespace std;using namespace scythe;template <typename RNGTYPE>void MCMCfactanal_impl (rng<RNGTYPE>& stream, const Matrix<>& X,			Matrix<>& Lambda, 			Matrix<>& Psi, Matrix<>& Psi_inv,			const Matrix<>& Lambda_eq, 			const Matrix<>&  Lambda_ineq, 			const Matrix<>& Lambda_prior_mean, 			const Matrix<>& Lambda_prior_prec,			const Matrix<>& a0, const Matrix<>& b0,			unsigned int burnin, unsigned int mcmc, 			unsigned int thin, 			unsigned int verbose, 			unsigned int storescores, Matrix<>& result) {    // constants   const unsigned int K = X.cols();  // number of manifest variables  const unsigned int N = X.rows();  // number of observations  const unsigned int D = Lambda.cols();  // number of factors  const unsigned int tot_iter = burnin + mcmc;    const unsigned int nsamp = mcmc / thin;  const Matrix<> I = eye(D);  const Matrix<> Lambda_free_indic = Matrix<>(K, D);  for (unsigned int i=0; i<(K*D); ++i){    if (Lambda_eq[i] == -999) Lambda_free_indic[i] = 1.0;  }    // starting value for phi  Matrix<> phi = Matrix<>(N,D);    // storage matrices (row major order)  Matrix<> Lambda_store = Matrix<>(nsamp, K*D);  Matrix<> Psi_store = Matrix<>(nsamp, K);  Matrix<> phi_store;  if (storescores==1){    phi_store = Matrix<double>(nsamp, N*D);  }    unsigned int count    = 0;   // sampling begins here    for (unsigned int iter=0; iter < tot_iter; ++iter){        // sample phi    NormNormfactanal_phi_draw(phi, I, Lambda, Psi_inv, 			      X, N, D, stream);        // sample Lambda    NormNormfactanal_Lambda_draw(Lambda, Lambda_free_indic,				 Lambda_prior_mean, 				 Lambda_prior_prec,				 phi, X, Psi_inv, 				 Lambda_ineq, 				 D, K, stream);        // sample Psi    NormIGfactanal_Psi_draw(Psi, X, phi, Lambda, 			    a0, b0, K, N, stream);    for (unsigned int i=0; i<K; ++i)      Psi_inv(i,i) = 1.0 / Psi(i,i);        // print results to screen    if (verbose > 0 && iter % verbose == 0){      Rprintf("\n\nMCMCfactanal iteration %i of %i \n", (iter+1), tot_iter);      Rprintf("Lambda = \n");      for (unsigned int i=0; i<K; ++i){	for (unsigned int j=0; j<D; ++j){	  Rprintf("%10.5f", Lambda(i,j));	}	Rprintf("\n");      }      Rprintf("diag(Psi) = \n");      for (unsigned int i=0; i<K; ++i){	Rprintf("%10.5f", Psi(i,i));      }      Rprintf("\n");    }        // store results    if ((iter % thin)==0 && iter >= burnin ) {	      // store Lambda      //Matrix<> Lambda_store_vec = Lambda.resize(1, K*D, true);      //for (int l=0; l<K*D; ++l)      //Lambda_store(count, l) = Lambda(l);      rmview(Lambda_store(count, _)) = Lambda;            // store Psi      for (unsigned int i=0; i<K; ++i)	Psi_store(count, i) = Psi(i,i);      // stop phi      if (storescores==1){	//Matrix<> phi_store_vec = phi.resize(1, N*D, true);	//for (int l=0; l<N*D; ++l)	// phi_store(count, l) = phi(l);	rmview(phi_store(count, _)) = phi;      }      count++;    }        // allow user interrupts    R_CheckUserInterrupt();      } // end Gibbs loop    // return output  //Matrix<double> result;  result = cbind(Lambda_store, Psi_store);  if(storescores == 1) {    result = cbind(result, phi_store);  }  }extern "C" {     void MCMCfactanal(double *sampledata, const int *samplerow, 		    const int *samplecol, const double *Xdata, 		    const int *Xrow, const int *Xcol, const int *burnin, 		    const int *mcmc, const int *thin, const int *uselecuyer,		    const int *seedarray, const int *lecuyerstream, 		    const int *verbose, const double *Lambdadata, 		    const int *Lambdarow, const int *Lambdacol, 		    const double *Psidata, const int *Psirow, 		    const int *Psicol, const double *Lameqdata, 		    const int *Lameqrow, const int *Lameqcol, 		    const double *Lamineqdata, const int *Lamineqrow, 		    const int *Lamineqcol, const double *Lampmeandata, 		    const int *Lampmeanrow, const int *Lampmeancol, 		    const double *Lampprecdata, const int *Lampprecrow, 		    const int *Lamppreccol, const double *a0data, 		    const int *a0row, const int *a0col, 		    const double *b0data, const int *b0row, 		    const int *b0col, const int *storescores) {        // pull together Matrix objects    const Matrix <> X(*Xrow, *Xcol, Xdata);    Matrix <> Lambda(*Lambdarow, *Lambdacol, Lambdadata);    Matrix <> Psi(*Psirow, *Psicol, Psidata);    Matrix <> Psi_inv = invpd(Psi);    const Matrix <> Lambda_eq(*Lameqrow, *Lameqcol, 			      Lameqdata);    const Matrix <> Lambda_ineq(*Lamineqrow, *Lamineqcol, 				Lamineqdata);    const Matrix <> Lambda_prior_mean(*Lampmeanrow, 				      *Lampmeancol, 				      Lampmeandata);    const Matrix <> Lambda_prior_prec(*Lampprecrow, 				      *Lamppreccol, 				      Lampprecdata);    const Matrix <> a0(*a0row, *a0col, a0data);    const Matrix <> b0(*b0row, *b0col, b0data);        Matrix<> storagematrix;    MCMCPACK_PASSRNG2MODEL(MCMCfactanal_impl, X, Lambda, Psi, Psi_inv,			   Lambda_eq, Lambda_ineq, Lambda_prior_mean, 			   Lambda_prior_prec,			   a0, b0, *burnin, *mcmc, *thin, 			   *verbose, *storescores, storagematrix);        const unsigned int size = *samplerow * *samplecol;    for (unsigned int i = 0; i < size; ++i)      sampledata[i] = storagematrix(i);  }}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -