手动计算excel幂律r ^ 2

时间:2015-08-02 17:16:38

标签: excel

在Excel中添加趋势线时,我无法手动计算幂律曲线的r ^ 2(确定系数)。我无法获得与Excel相同的值。我尝试通过取y值的对数(基数10)来线性化数据,然后计算线性数据的r ^ 2,但是我无法获得与Excel的幂律r ^ 2相同的结果。这是一个例子。请注意,我很清楚我将在这里发布的数据甚至不会接近幂律曲线,但这不是重点,而是我当时正在测试的数据。

假设我有以下x和y值。

# include <iostream>
# include <armadillo>
# include <algorithm>
# include <array>

arma::mat qr_solve2(const arma::mat &A,const arma::mat &B);

arma::mat mrdivide(arma::mat A, arma::mat B)
    {
    return solve(A.t(), B.t());
    }
int main()
    {
    std::array<double,12> arr = {
        761.544 , 0 ,639.5,
        3.762513283904080e+06,0 , 761.544,
        399.5,1.824431013104484e+06,0,
        0, 1.0, 9.837714402800992e+03
        };
    arma::mat A(4,3);
    std::copy(arr.begin(),arr.end(),A.begin());
    arma::mat B;
    B << 457 << 520 << 1 << arma::endr;
    arma::mat V = mrdivide(A,B);
    std::cout<<V<<std::endl;
    std::cout<<A.t()*V<<std::endl;
    arma::mat Z = qr_solve2(A.t(),B.t());
    std::cout<<Z<<std::endl;
    std::cout<<A.t()*Z<<std::endl;
    return 0;
    }
arma::mat qr_solve2(const arma::mat &A,const arma::mat &B)
    {
    arma::mat Q, R;
    arma::qr(Q,R,A);
    unsigned int s = R.n_rows-1;
    arma::mat R_ = R( arma::span(0,s), arma::span(0,s-1) ) ;

    R_ = arma::join_horiz(R_,R.col(s+1));
    arma::mat newB = Q.t()*B;
    arma::mat X(s+1,1);

    for (int i = s; i >= 0; i--)
        {
        X[i] = newB[i];
        for (int j = s; j != i; j--)
            X[i] = X[i] - R_(i,j) * X[j];
        X[i] = X[i]/R_(i,i);
        }

    arma::mat res = X( arma::span(0,s-1), arma::span(0,0) ) ;

    res =  arma::join_vert(res,arma::mat(1,1, arma::fill::zeros));
    res = arma::join_vert(res,X.row(s));
    return res;
    }

当我把它放到excel中,并在图表中添加趋势线时,Excel向我显示幂律方程为y = 0.9414 * x ^( - 1.395),r ^ 2值为0.6519。

现在我想手动获取相同的值。首先,我通过取所有点的对数基数10来线性化数据。请注意,我也尝试采用自然对数,但最终结果是相同的值。现在我的新x和y如下。

x   y
2   0.25
3   0.25
4   0.3125
5   0.0625
6   0.0625
7   0.0625

然后我使用微软页面上的公式计算这个“线性”数据的r ^ 2。

r ^ 2 =(sum((x-xbar)(y-ybar))/(sqrt(sum((x-xbar)^ 2))* sqrt(sum((y-ybar)^ 2)) ))^ 2

https://support.office.com/en-gb/article/RSQ-function-d7161715-250d-4a01-b80d-a8364f2be08f

我获得的r ^ 2值为0.712549414。请注意,如果我绘制此线性数据,添加线性趋势线,并显示r ^ 2,则该值也为0.712549414。

为什么不对数据进行线性化并计算r ^ 2值(0.712549414)给出与原始数据(0.6519)的幂律曲线图中所示的r ^ 2相同的值?如何手动计算原始数据的幂律曲线中显示的值?

2 个答案:

答案 0 :(得分:0)

您需要记录x和y的对数以使其线性化,然后两种方式都得到相同的答案,即

x'=log(x)
y'=log(y)

并使用x'和y'进行相关。

因为如果公式是

形式

y=xk

其中k是常数,取日志会给你

log(y)=klog(x)

所以

y'=kx'

这是一条直线。

答案 1 :(得分:0)

方程的更简化形式可以用于计算r ^ 2。 令y = f(x),如果f(x)是线性的,则

  ybar = average(yi)
  R^2 = sum((f(xi) - ybar)^2) / sum((yi-ybar)^2)

在幂律情况下,y = a * x ^ b。 然后x和y都需要通过在两边取ln来线性化, 方程变为ln(y)= ln(a)+ b * ln(x)

 ybar = average(ln(yi))
 R^2 = sum((ln(a) + b * ln(xi) - ybar)^2) / sum((ln(yi) - ybar)^2)