[英]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
根據您的代碼:
(統計數據)在排序之前對變量進行標准化無害,但由於標准化變量的等級與變量本身的等級相同,因此是不必要的。
(狀態)通常也不需要在變量中(即在數據集的每個觀察值或每一行中)放置常量。
(統計數據)您應該按值的數量而不是最大排名來縮放等級。 如果多個值並列為最大值,則觀察到的最高等級將小於值的數量。 (玩具示例:5個值1、2、3、3、3將排名1、2、4、4、4,因此最高排名是4,而不是5。)
(?)我無法理解您要用行replace max = 0.5/max
做的事情
(狀態)沒有函數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
變量month
, sector
等都是可選的(即bysort month sector:
是可選的,在使用的情況下,你想要做的按組的操作)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.