从.lm.fit()计算p值的快速方法

时间:2018-04-09 12:24:51

标签: r lm

我正在运行模拟并使用.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)

2 个答案:

答案 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);
}