在 R 中绘制分位数回归估计作为其分位数的函数
Plotting quantile regression estimates as function of their quantiles in R
以下代码是基于瑞士数据集 (datasets::swiss
) 的可重现示例。
我的问题是我想根据 tau 值(分位数)从 [ 0:1];但不幸的是我没有成功。非常感谢您的宝贵帮助,当然,如果我忘记了什么,我可以编辑我的post。
代码:
library(quantreg)
library(limma)
#Generalized Functions
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)))
return(betas)
}
#Callers
swiss <- datasets::swiss
smrq_models <- run_smrq(data=swiss, fml=Fertility~., response="Fertility")
@langtang 的解决方案给出了这个图形输出:
在不对 run_smrq()
输出的“正确性”做任何评论的情况下,您可以试试这个:
library(dplyr)
library(tidyr)
library(ggplot2)
as.data.frame(t(smrq_models)) %>%
mutate(q=row_number()) %>%
pivot_longer(!q,names_to="beta",values_to = "coef") %>%
ggplot(aes(q,coef,color=beta)) +
geom_point()
此外,如果 beta 的尺度差异很大,那么您的可视化方法可能不是最合适的。作为起点,您可以添加 + facet_wrap(~beta, scales="free_y")
以下代码是基于瑞士数据集 (datasets::swiss
) 的可重现示例。
我的问题是我想根据 tau 值(分位数)从 [ 0:1];但不幸的是我没有成功。非常感谢您的宝贵帮助,当然,如果我忘记了什么,我可以编辑我的post。
代码:
library(quantreg)
library(limma)
#Generalized Functions
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)))
return(betas)
}
#Callers
swiss <- datasets::swiss
smrq_models <- run_smrq(data=swiss, fml=Fertility~., response="Fertility")
@langtang 的解决方案给出了这个图形输出:
在不对 run_smrq()
输出的“正确性”做任何评论的情况下,您可以试试这个:
library(dplyr)
library(tidyr)
library(ggplot2)
as.data.frame(t(smrq_models)) %>%
mutate(q=row_number()) %>%
pivot_longer(!q,names_to="beta",values_to = "coef") %>%
ggplot(aes(q,coef,color=beta)) +
geom_point()
此外,如果 beta 的尺度差异很大,那么您的可视化方法可能不是最合适的。作为起点,您可以添加 + facet_wrap(~beta, scales="free_y")