[Rcpp-devel] [rcpp-devel] arma::mat constructor vs Rcpp::as and interaction with .insert_col
Dirk Eddelbuettel
edd at debian.org
Fri Apr 12 04:07:10 CEST 2013
Dale,
Here is a simple fix: just _join_ the matrix and the col vector.
Result first (now with set.seed(42), so rngs different)
R> sourceCpp("/tmp/dale.cpp")
R> set.seed(42) ## needed !!
R> mat <- cbind(rnorm(50), rnorm(50), rnorm(50))
R> y <- rnorm(50)
R> fastLm2(y, mat)
$coefficients
[,1]
[1,] -0.0227235
[2,] 0.0858994
[3,] -0.0457201
[4,] -0.0441346
$stderr
[,1]
[1,] 0.115021
[2,] 0.141599
[3,] 0.136838
R> lm(y ~ mat)
Call:
lm(formula = y ~ mat)
Coefficients:
(Intercept) mat1 mat2 mat3
-0.0227 0.0859 -0.0457 -0.0441
R>
The key part is to use join_rows() and to actually use the new matrix:
arma::colvec ones = arma::ones<arma::colvec>(X.n_rows);
arma::mat X2 = arma::join_rows(ones, X);
arma::colvec coef = arma::solve(X2, y);
arma::colvec resid = y - X2*coef;
Full function below.
Hth, Dirk
// [[Rcpp::export]]
Rcpp::List fastLm2(Rcpp::NumericVector yr, Rcpp::NumericMatrix Xr) {
int n = Xr.nrow(), k = Xr.ncol();
arma::mat X(Xr.begin(), n, k, false);
arma::colvec y(yr.begin(), yr.size(), false);
arma::colvec ones = arma::ones<arma::colvec>(X.n_rows);
arma::mat X2 = arma::join_rows(ones, X);
arma::colvec coef = arma::solve(X2, y);
arma::colvec resid = y - X2*coef;
double sig2 = arma::as_scalar(arma::trans(resid)*resid/(n-k));
arma::colvec stderrest = arma::sqrt(
sig2 * arma::diagvec( arma::inv(arma::trans(X)*X)) );
return Rcpp::List::create(Rcpp::Named("coefficients") = coef,
Rcpp::Named("stderr") = stderrest);
}
--
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
More information about the Rcpp-devel
mailing list