2013-04-03 4 views
4

Мой главный вопрос: как R вычисляет R^2 в случае WLS? Он не просто взвешивает наблюдения, а затем вычисляет R^2. Чтобы попытаться выяснить это, я шел через исходный код, пока я не столкнулся с этим в lm.wfit код:В lm.wfit, что делает z <- .Call (C_Cdqrls, x * wts, y * wts, tol)?

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

Что здесь делается? Кто-нибудь знает, как я могу получить доступ к коду для этого, чтобы узнать подробности? I.e., что возвращается к z? Как есть C_Cdqrls, x*wts, y*wts, tol б/у?

То, что я понимаю до сих пор (и я не уверен, правильно ли это), заключается в том, что .Call означает, что R выполняет этот код на C. Однако я хотел бы посмотреть, как это делается на C, если возможно ,

Спасибо!

+2

https://github.com/wch/r-source/blob/trunk/src /library/stats/src/lm.c – mnel

ответ

2

Поиск Google быстро производится следующим образом:

https://svn.r-project.org/R/trunk/src/library/stats/src/lm.c

+0

Спасибо DWin. На каких условиях у вас Google точно? Я думаю, что моя незнакомость с этим языком кодирования (это C?) Мешает мне правильно искать. Правильно ли, что я смотрю на вычисления регрессии в C? т. е. вычисленные здесь значения остатков и приложенных значений? Спасибо за ваш ответ. – user722224

+0

Если я правильно помню, то стратегия была: «trunk Cdqrls». «trunk» был выбран, потому что я знал, что это будет в URL-адресе текущей версии R-источника. Второй термин был выбран немного случайно, так как я просто щелкнул dbl-click по имени модуля и не потянул «C_». –

+0

это аккуратный трюк - спасибо за понимание! – user722224

5

Значение R squared фактически вычисляется при вызове summary.lm, вы можете посмотреть на исходный код для любой функции, либо в самом хранилище SVN (https://svn.r-project.org/R/) , или this read only mirror на github.

Глядя в 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) 
+0

Большое спасибо за то, что нашли время ответить на это. Повторив мой вопрос, я понял, что мой вопрос неясен. Я обнаружил вышеприведенный код и фактически пытаюсь реплицировать это вручную. Очевидно, все переменные определены там (r, f, w, rss, mss), однако r и f определены в терминах z (z $ остатков и z $ fit.values). Взгляд на исходный код показывает, что z вычисляется следующим образом: z <- .Call (C_Cdqrls, x * wts, y * wts, tol). Это тот шаг, о котором я запутался - я не понимаю, как вычисляется z. Еще раз спасибо за то, что посмотрели! – user722224

+0

Я понимаю, что я мог бы просто запустить lm по взвешенным значениям и получить z $ остатки и z $ fit.values, а затем посмотреть, могу ли я проверить результаты. Тем не менее, мне бы очень хотелось узнать, что происходит за кулисами здесь, если это возможно. Спасибо. – user722224

 Смежные вопросы

  • Нет связанных вопросов^_^