В lm.wfit какво прави z ‹- .Call(C_Cdqrls, x *wts, y*wts, tol)?

Моят основен въпрос е как R изчислява R^2 в случая на WLS? Той не просто претегля наблюденията и след това изчислява R^2. За да се опитам да разбера това, минах през изходния код, докато не попаднах на това в кода lm.wfit:

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

Какво се прави тук? Някой знае ли как мога да получа достъп до кода за това, за да стигна до подробностите? Т.е. какво се връща на z? Как се използват C_Cdqrls, x*wts, y*wts, tol?

Това, което разбирам досега (и не съм сигурен дали е правилно), е, че .Call означава, че R изпълнява този код в C. Бих искал обаче да видя как това се прави в C, ако е възможно.

Благодаря!


r lm
person user722224    schedule 03.04.2013    source източник
comment
github.com/wch/r- source/blob/trunk/src/library/stats/src/lm.c   -  person mnel    schedule 03.04.2013


Отговори (2)


Стойността R squared всъщност се изчислява при извикване на summary.lm, можете да погледнете изходния код за всяка функция или в действителното svn хранилище (https://svn.r-project.org/R/), или това огледало само за четене в 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)
person mnel    schedule 03.04.2013
comment
много ви благодаря, че отделихте време да отговорите на това. След като прочетох въпроса си отново, разбрах, че въпросът ми е неясен. Открих кода по-горе преди и всъщност се опитвам да го копирам ръчно. Очевидно всички променливи са дефинирани там (r,f,w,rss,mss), но r и f са дефинирани по отношение на z (z$residuals и z$fitted.values). Поглед към изходния код показва, че z се изчислява по следния начин: z ‹- .Call(C_Cdqrls, x wts, ywts, tol). Това е стъпката, за която съм объркан - не разбирам как се изчислява z. Благодаря отново, че потърси! - person user722224; 03.04.2013
comment
Осъзнавам, че мога просто да изпълня lm върху претеглените стойности и да получа z$residuals и z$fitted.values ​​и след това да видя дали мога да потвърдя резултатите. Въпреки това, наистина бих искал да знам какво се случва зад кулисите тук, ако е възможно. Благодаря ти. - person user722224; 03.04.2013

Търсене в Google бързо даде това:

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

person IRTFM    schedule 03.04.2013
comment
Благодаря DWin. Какви термини потърси в гугъл? Мисля, че непознаването ми на този език за кодиране (това C ли е?) ме възпря да търся правилно. Правилно ли е, че гледам регресионни изчисления в C? т.е. тук ли се изчисляват остатъците и монтираните стойности? Благодаря ви за отговора. - person user722224; 03.04.2013
comment
Ако си спомням правилно стратегията беше: trunk Cdqrls. trunk беше избран, защото знаех, че това ще бъде в URL адреса на текущата версия на източника на R. Вторият член беше избран леко случайно, тъй като току-що щракнах с двойно щракване върху името на модула и не изтегли C_. - person IRTFM; 03.04.2013
comment
това е страхотен трик - благодаря за прозрението! - person user722224; 03.04.2013