-1

我对 R 和一般编码相对较新,我一直在尝试复制此PDF中提供的示例(https://support.sas.com/resources/papers/proceedings17/SAS0525-2017.pdf)关于分位数回归在 SAS 中。该示例可在第 14 至 17 页上找到,并应用于一个简单的数据集,以确定学生在控制年龄时的表现百分位数。

我从未使用过 SAS 并尝试使用 quantreg 包在 R 中复制示例,但到目前为止我还无法获得回归分位数级别的结果。(我不在乎图表)

是否有人可以提供将 SAS 代码转换为 R 的示例?

编辑:我很抱歉在没有示例的情况下发布此内容,因为卡梅伦先生向我指出我的问题的格式之前不够充分。我希望这现在更合适了。感谢您的帮助!

这是我所做的一个例子:

library(faux)
library(dplyr)
library(tidyr)
library(quantreg)
Student_ID <- c(LETTERS[1:26])
Age <- sample( x = 14:18, size = 26, replace = TRUE)
Exam_Data <- data.frame(Student_ID, Age)
Exam_Data$Score <- jitter(rnorm_pre(Exam_Data$Age, mu = 50, sd = 2, r = 0.8, empirical = TRUE))
Exam_Data_Rank <- Exam_Data %>%
mutate(Ranked_Standard = percent_rank(Score))
Score_rq90 <- rq(Score ~ Age  + I(Age^2), data = Exam_Data_Rank, tau = 0.9)

Score_rq90 <- rq(Score ~ Age + I(Age^2) +Student_ID, data = Exam_Data_Rank, tau = 0.9)

最后一行代码为我产生了一个错误。我现在的问题是如何使用 quantreq 来获取各个学生 ID 的分数等级。我可以对分数本身进行回归,但我不知道如何像示例中那样对每个人进行回归。

4

1 回答 1

0

我认为您的公式中的主要问题是您试图将 Student_ID 添加到公式中。您可能意味着在这里使用固定效果,在这种情况下,您可能需要自己构造 FE 变量,或者使用rqpdlqmm包将数据设置为面板。

转到您引用的文档并使用您提供的数据,这应该可以重现您的目标。这将删除 Student_ID 变量并将其替换为年龄变量立方以及倒置年龄,这适用于不同的 tau 值。我冒昧地使用拟合数据从示例中复制图表,以确保一切正常:

library(faux)
library(dplyr)
library(tidyr)
library(quantreg)
library(ggplot2)

Student_ID <- c(LETTERS[1:26])
Age <- sample( x = 14:18, size = 26, replace = TRUE)
Exam_Data <- data.frame(Student_ID, Age)
Exam_Data$Score <- jitter(rnorm_pre(Exam_Data$Age, mu = 50, sd = 2, r = 0.8, empirical = TRUE))
Exam_Data_Rank <- Exam_Data %>%
  mutate(Ranked_Standard = percent_rank(Score))

Score_rq90 <- rq(Score ~ Age  + I(Age^2), data = Exam_Data_Rank, tau = 0.9)

Score_rq_all <- rq(Score ~ Age + I(Age^2) + I(Age^3) + I(1/Age), data = Exam_Data_Rank, tau = c(seq(0.1, 0.9, by = 0.1)))
fitted_data <- data.frame(x_vals = Score_rq_all$x, fitted_vals = Score_rq_all$fitted.values) %>%
  select(x_vals.Age, tidyselect::starts_with("fitted_vals")) %>%
  pivot_longer(cols = tidyselect::starts_with("fitted_vals")) %>%
  mutate(name = paste0("0", gsub(pattern = "fitted_vals", replacement = "",
                     x = name))) %>%
  rename("x_vals" = "x_vals.Age", "tau" = "name", "fitted_val" = "value")
  
first_graph <- ggplot(data = Exam_Data_Rank, aes(x = Age, y = Score)) +
  geom_point()

first_graph
 
second_graph <- ggplot() +
  geom_point(data = Exam_Data_Rank, aes(x = Age, y = Score)) +
  geom_smooth(data = fitted_data, aes(x = x_vals, y = fitted_val, group = tau, color = tau))
                 
second_graph

于 2022-02-17T14:32:55.927 回答