【问题标题】:In lm.wfit, what does z <- .Call(C_Cdqrls, x *wts, y*wts, tol) do? [duplicate]在 lm.wfit 中,z <- .Call(C_Cdqrls, x *wts, y*wts, tol) 做了什么? [复制]
【发布时间】:2013-03-24 12:10:26
【问题描述】:

我的首要问题是,在 WLS 案例中,R 如何计算 R^2?它不仅对观察结果进行加权,然后计算 R^2。为了弄清楚这一点,我一直在查看源代码,直到在lm.wfit 代码中遇到这个问题:

z <- .Call(C_Cdqrls, x *wts, y*wts, tol) 

这里正在做什么?有谁知道我如何访问此代码以获取详细信息?即,返回给z 的内容是什么? C_Cdqrlsx*wtsy*wtstol是如何使用的?

到目前为止我的理解(我不确定它是否正确)是.Call 表示 R 正在 C 中执行此代码。但是,我想看看这是如何在 C 中完成的,如果可能的。

谢谢!

【问题讨论】:

标签: r lm


【解决方案1】:

R squared的值实际上是在调用summary.lm时计算出来的,你可以查看任何函数的源代码,无论是在实际的svn存储库中(https://svn.r-project.org/R/),还是在github上的this read only mirror

https://github.com/wch/r-source/blob/trunk/src/library/stats/R/lm.R 寻找 summary.lm

我们看到以下对权重的计算 (w)

r <- z$residuals
f <- z$fitted.values
w <- z$weights
if (is.null(w)) {
    mss <- if (attr(z$terms, "intercept"))
        sum((f - mean(f))^2) else sum(f^2)
    rss <- sum(r^2)
} else {
    mss <- if (attr(z$terms, "intercept")) {
        m <- sum(w * f /sum(w))
        sum(w * (f - m)^2)
    } else sum(w * f^2)
    rss <- sum(w * r^2)
    r <- sqrt(w) * r
}
# ..... some other code
# ... then this definition
ans$r.squared <- mss/(mss + rss)

【讨论】:

  • 非常感谢您抽出宝贵时间对此做出回应。再次阅读我的问题后,我意识到我的问题并不清楚。我之前发现了上面的代码,实际上是在尝试手动复制它。显然,所有变量都在那里定义(r,f,w,rss,mss),但是 r 和 f 是根据 z 定义的(z$residuals 和 z$fitted.values)。查看源代码可知,z 的计算方式如下:z wts, ywts, tol)。这是我感到困惑的步骤 - 我不明白 z 是如何计算的。再次感谢您的关注!
  • 我意识到我也可以只对加权值运行 lm 并获得 z$residuals 和 z$fitted.values,然后看看我是否可以验证结果。但是,如果可能的话,我真的很想知道这里的幕后情况。谢谢。
【解决方案2】:

【讨论】:

  • 感谢 DWin。你用谷歌搜索了哪些术语?我认为我不熟悉这种编码语言(这是 C 吗?)阻止了我正确搜索。我在 C 中查看回归计算是否正确?即,是否在这里计算残差和拟合值?感谢您的回复。
  • 如果我没记错的话,策略是:“trunk Cdqrls”。选择“trunk”是因为我知道它会在当前版本的 R 源的 URL 中。第二个术语是偶然选择的,因为我只是在模块名称上单击复制并没有拉入“C_”。
  • 这是一个巧妙的技巧 - 感谢您的洞察力!
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2015-07-04
  • 2021-10-24
  • 1970-01-01
相关资源
最近更新 更多