我正在运行模拟并使用.lm.fit()
拟合线性模型。虽然速度非常快,但这个功能并没有提供预测因素。 p值。有没有一种快速的方法来计算它们(可能来自.lm.fit()
返回的值)?我知道this方法来计算近似p值,但我需要精确的p值。
更新:
Dirk Eddelbuettel通过结合我们获得的两个答案,提供了最适合lm和Ben Bolker计算p值的方法:
set.seed(101)
X <- cbind(1,matrix(1:10))
y <- rnorm(10)
mdl <- RcppArmadillo::fastLmPure(X, y)
pval <- 2*pt(abs(mdl$coefficients/mdl$stderr), mdl$df.residual, lower.tail=FALSE)
答案 0 :(得分:3)
Dirk的答案会更快,但如果方便的话,这里是纯R的实现(从summary.lm
中提取你需要的位,并假设没有非全等级模型矩阵的问题等。)
示例:
set.seed(101)
X <- cbind(1,matrix(1:10))
y <- rnorm(10)
m <- .lm.fit(X,y)
p值计算:
rss <- sum(m$residuals^2)
rdf <- length(y) - ncol(X)
resvar <- rss/rdf
R <- chol2inv(m$qr)
se <- sqrt(diag(R) * resvar)
2*pt(abs(m$coef/se),rdf,lower.tail=FALSE)
与:比较:
coef(summary(lm(y~X-1)))[,"Pr(>|t|)"]
答案 1 :(得分:2)
对于这个问题(获得标准错误,因此得到p值),我在包RcppArmadillo,RcppEigen和RcppGSL中编写了函数fastLm()
的三个不同版本。部分原因当然也只是为了阐述。但你可以从那里开始。确保使用带有向量和矩阵的fastLmPure()
变体以及不公式界面 - 所有时间都用于去除公式。
在这里,只是为了踢,是RcppArmadillo变种:
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::export]]
List fastLm_impl(const arma::mat& X, const arma::colvec& y) {
int n = X.n_rows, k = X.n_cols;
arma::colvec coef = arma::solve(X, y); // fit model y ~ X
arma::colvec res = y - X*coef; // residuals
// std.errors of coefficients
double s2 = std::inner_product(res.begin(), res.end(),
res.begin(), 0.0)/(n - k);
arma::colvec std_err =
arma::sqrt(s2 *
arma::diagvec(arma::pinv(arma::trans(X)*X)));
return List::create(Named("coefficients") = coef,
Named("stderr") = std_err,
Named("df.residual") = n - k);
}