我正在使用在一篇科學論文中發現的修改后的分位數回歸函式。(來源:https ://arxiv.org/pdf/2111.04805.pdf )
我嘗試將此特定方法應用于我的資料集,但我想根據我的資料集中的條件執行此分位數回歸。這意味著我想實作類似于 group_by 條件的東西,如下所示:
qr_models = data %>%
group_by(latitude) %>%
do(model = rq(julian_day~year, tau = 1:99/100, method = "fn", data= .))
它在論文中的編碼方式如下,回圈是我想添加 group_by 的地方:
for (i in 1:n) {
alpha = i/(n 1)
alphas[i] = alpha
betas <- smrq(X,y,tau=alpha)
vals0[i] <- sum(y<(X %*% betas))
}
其中 n 是n <- 99(選擇的分位數解析度);vals0 <- rep(0,n)和alphas <- rep(0,n)。我傾向于避免在 R 中使用回圈,所以我對如何做有點迷茫。
以防萬一需要理解,該smrq()功能是前面提到的論文中描述的功能,并且編碼如下:
smrq <- function(X, y, tau){
p = ncol(X)
op.result <- optim(rep(0, p),
fn = minimize.logcosh,
method = 'BFGS',
X = X,
y = y,
tau = tau)
beta <- op.result$par
return (beta)
}
其中 X 是解釋變數矩陣,y 是回應變數。
我希望它足夠清楚,如果需要更多詳細資訊,我將很樂意更新我的帖子。非常感謝您的寶貴幫助。
uj5u.com熱心網友回復:
考慮將作者的整個處理程序封裝在用戶定義的方法中,該方法接收資料(swiss來自作者)作為輸入引數以及其他變數,包括公式(Fertility ~ .來自作者)和回應列("Fertility"來自作者)。
然后,使用 傳遞資料子集group_by。此外,作者for回圈可以重構為向量化回圈,例如sapply或vapply因為回傳是數字向量。
廣義函式
minimize.logcosh <- function(par, X, y, tau) {
diff <- y-(X %*% par)
check <- (tau-0.5)*diff (0.5/0.7)*logcosh(0.7*diff) 0.4
return(sum(check))
}
smrq <- function(X, y, tau){
p <- ncol(X)
op.result <- optim(
rep(0, p),
fn = minimize.logcosh,
method = 'BFGS',
X = X,
y = y,
tau = tau
)
beta <- op.result$par
return(beta)
}
run_smrq <- function(data, fml, response) {
x <- model.matrix(fml, data)[,-1]
y <- data[[response]]
X <- cbind(x, rep(1,nrow(x)))
n <- 99
betas <- sapply(1:n, function(i) smrq(X, y, tau=i/(n 1)))
# betas <- vapply(1:n, function(i) smrq(X, y, tau=i/(n 1)), numeric(1))
return(betas)
}
來電者
測驗作者的例子
swiss <- datasets::swiss
smrq_models <- run_smrq(data=swiss, fml=Fertility~., response="Fertility")
dplyr (使用group_map)
smrq_models <- data %>%
group_by(latitude) %>%
group_map(~ run_smrq(data=., fml=julian_day~year, response="julian_day")
base (使用by,面向物件的包裝器tapply)
smrq_models <- by(
data,
data$latitude,
function(sub) run_smrq(data=sub, fml=julian_day~year, response="julian_day")
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/465269.html
上一篇:R回圈問題-遍歷資料框
