【发布时间】:2021-11-17 21:11:24
【问题描述】:
如何手动创建“rq”类的对象,以便之后可以使用它来运行predict 函数?
感谢您非常有用的回复,mymdl 在此示例中现在属于“rq”类。将class(mymdl$coefficients) ="numeric" 添加到代码中解决了我的主要问题:predict(mymdl) 有效。
有趣的是,class(mdl$terms) 和 class(mymdl$terms) 不同。如果我设置class(mymdl$terms) = class(mdl$terms),那么predict(mymdl) 会产生NAs。我想知道为什么会这样..
library(quantreg)
data(engel) #load dataset
engel2 <- engel[1:100,] #keep subset for prediction
reg_formula <- foodexp ~ income #define regression formula
mdl <- rq(reg_formula,.5, data = engel) #run regression
#------------------------------------------
#remove non-essential information from mdl
#mdl$coefficients <- NULL
mdl$x <- NULL
mdl$y <- NULL
mdl$residuals <- NULL
mdl$dual <- NULL
mdl$fitted.values <- NULL
mdl$formula <- NULL
#mdl$terms <- NULL
mdl$xlevels <- NULL
mdl$call <- NULL
mdl$tau <- NULL
mdl$rho <- NULL
mdl$method <- NULL
mdl$model <- NULL
#Only mdl$coefficients and mdl$terms are
#essential for predicting
#------------------------------------------
engel2$foodexp_pr <- predict(mdl, newdata = engel2) #predict
#create own regression model
mymdl <- NULL
mymdl[["coefficients"]][["(Intercept)"]] <- 81.48225
mymdl[["coefficients"]][["income"]] <- 0.5601806
mymdl$terms <- reg_formula
class(mymdl) <- "rq"
class(mymdl$coefficients) ="numeric"
engel2$foodexp_pr2 <- predict(mymdl, newdata = engel2) #works
#Minor question: why does predict produce NAs in this case?
class(mymdl$terms) = class(mdl$terms)
engel2$foodexp_pr3 <- predict(mymdl, newdata = engel2) #produces NAs
我不熟悉使用类。欢迎任何帮助和建议。
编辑 1:我已经扩展了我的示例并纳入了您非常有用的反馈。 mymdl 现在是“rq”类。我还确定了predict 函数使用的最基本信息(即mdl$coefficients 和mdl$terms)。
编辑 2: 将我的解决方案添加到示例中。但是,还有一个小问题。
【问题讨论】:
-
一般来说,可以使用
class(mymdl) <- c("rq", class(mymdl))之类的东西将"rq"添加到类名向量中,尽管我不知道 那是@ 987654337@ 预计(我没有安装quantreg)。另一种选择是调用特定的 S3 方法,如quantreg::predict.rq(mymdl)(如果未导出,则使用:::)。同样,我还没有测试过,但这是让 R 在对象上使用特定类/S3 方法的两种方法。 -
如果您打印
str(mdl)和str(mymdl),您会发现您的coefficients和terms组件与rq()生成的组件完全不同。coefficients应该是一个数字向量,而不是一个列表。 -
谢谢,在代码中添加
class(mymdl$coefficients) ="numeric"解决了这个问题。预测功能有效! -
更简单的解决方案是使用
mymdl[["coefficients"]] <- c("(Intercept)" = 81.48225, "income" = 0.5601806)创建它。