簡體   English   中英

如何使用Stata執行基於秩的逆法向變換(來自R)

[英]How to do Rank based- inverse normal transformation using Stata (from R)

我在R( rntransform {GenABEL} )中具有此函數,該函數對變量執行反正態rankBased轉換,並希望在Stata中執行相同的操作。 但是,我似乎無法解讀最后一步( qnorm(out) ):

function (formula, data, family = gaussian) 
{
    if (is(try(formula, silent = TRUE), "try-error")) {
        if (is(data, "gwaa.data")) 
            data1 <- phdata(data)
        else if (is(data, "data.frame")) 
            data1 <- data
        else stop("'data' must have 'gwaa.data' or 'data.frame' class")
        formula <- data1[[as(match.call()[["formula"]], "character")]]
    }
    var <- ztransform(formula, data, family)
    out <- rank(var) - 0.5
    out[is.na(var)] <- NA
    mP <- 0.5/max(out, na.rm = T)
    out <- out/(max(out, na.rm = T) + 0.5)
    out <- qnorm(out)
    out
}

有人知道如何在Stata中做到這一點嗎?

應該是這樣的

  egen stdVar = std(Var)
  egen stdVar_rank=rank(stdVar)-0.5
  egen max= max(stdVar_rank)
  replace max = 0.5/max
  replace  stdVar_rank= stdVar_rank/max
  gen InvRankNormVar =  qnorm(stdVar_rank) -->?

您需要的文件記錄在各個地方,例如

http://www.stata.com/support/faqs/statistics/percentile-ranks-and-plotting-positions/

http://www.stata-journal.com/sjpdf.html?articlenum=gr0027

根據您的代碼:

  1. (統計數據)在排序之前對變量進行標准化無害,但由於標准化變量的等級與變量本身的等級相同,因此是不必要的。

  2. (狀態)通常也不需要在變量中(即在數據集的每個觀察值或每一行中)放置常量。

  3. (統計數據)您應該按值的數量而不是最大排名來縮放等級。 如果多個值並列為最大值,則觀察到的最高等級將小於值的數量。 (玩具示例:5個值1、2、3、3、3將排名1、2、4、4、4,因此最高排名是4,而不是5。)

  4. (?)我無法理解您要用行replace max = 0.5/max做的事情

  5. (狀態)沒有函數qnorm() 您想要的一個稱為invnormal() ,因為help functions會告訴您。

我想你想要的是

egen rank = rank(Var)
su Var, meanonly 
gen InvRankNormVar = invnormal((rank - 0.5) / r(N)) 

summarize后立即可訪問的非缺失值的數量為r(N)

PS我沒有嘗試閱讀您的R代碼。 我只具有R初學者的資格。

如果您想再次使用此計算,請嘗試使用此ado代碼(相當於Stata中的R函數)。 將ado文件保存在C:/ado/personal/_/_gnormalize.ado (或您的個人ado文件所在的位置)中:

program define _gnormalize
    version 9.2
**************************************[ NORMALIZE ]********************************
* 
* This function converts a raw factor into normalized Z-Score
*   option `1' is the raw factor
*   option `2' is additional grouping, e.g. sector
*
**************************************[ NORMALIZE ]*******************************

    gettoken type 0 : 0
    gettoken g    0 : 0
    gettoken egs 0 : 0
    syntax varlist(min=1) [, BY(string)]

    if `"`by'"'!="" {
        local by `"by `by':"'
    }

    quietly {
        gen `type' `g' = .
        `by' egen `g'rank = rank(`varlist'), unique
        `by' egen `g'count = count(`varlist') if `varlist'~=.
        replace `g'=invnormal((`g'rank-0.5)/`g'count) if `varlist'~=.
        drop `g'rank `g'count
    }
end

用法如下:

bysort month sector: egen my_transscore = normalize(my_factor)

其中, by變量monthsector等都是可選的(即bysort month sector:是可選的,在使用的情況下,你想要做的按組的操作)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM