【问题标题】:How to keep a variable in fit$model for lm() in R that I'm *not* using within the lm call itself?如何在我*不*在 lm 调用本身中使用的 R 中的 lm() 的 fit$model 中保留一个变量?
【发布时间】:2021-04-20 22:15:57
【问题描述】:

我希望能够在拟合模型后索引我的模型。 说我有

df <- data.frame(a = c(1,2,3), 
                 b = c(2,3,1000), 
                 country = c("Malawi", "USA","UK"))

然后,我运行:

fit<-lm(a~b,data=df)

我生成的 fit$model 不再具有“国家”变量,因此很难做类似的事情

  • 运行回归,然后删除某些国家作为稳健性 测试。
  • 运行回归,然后找出哪些国家 异常值。

我知道这方面存在“黑客”,例如使用行索引,但我经常发现自己进一步对原始数据集进行子集化,而且我害怕跟踪行索引。

例如从上面的示例中,我看到英国是一个异常值。

所以,我有两个选择:

lm(a~b,data=fit$model[-3,])
lm(a~b,data=df[df$country!="UK",])

第二个选项对我来说更清楚,但是因为 R 中的汇总统计和测试(例如厨师距离)只给我行 index,我最终不得不做第一个选项比我想要的还要多。在我试图测试对异常值或杠杆数据的稳健性并且还想知道这些数据是哪些国家(或其他变量)的大型面板数据集中,这变得特别乏味。

理想情况下,我想要一个选项来做类似的事情

lm(a~b,data=fit$model[fit$model$country!="UK",])

请帮忙,非常感谢!

【问题讨论】:

  • 听起来您正在尝试做很多事情,例如调查预测和更新模型。您可以使用broom::augment(model, your_data) 向您的数据集添加预测,也可以使用update 更新您的模型
  • 我从没听说过扫帚。谢谢!如果人们遇到另一种解决方案,我将保持未回答的问题,但粗略的一看似乎它解决了我的所有问题!

标签: r dataframe linear-regression


【解决方案1】:

我假设问题是从 lm 模型中识别原始数据帧的行,该模型在这些行的子集上运行,其中子集运行在不使用所有列的情况下执行。

关于问题中行名的特征,我根本不会认为它们的使用是负面的。行名称是每个数据框的固有部分,旨在标识行。如果您确实使用案例名称识别行,这些案例名称将由许多函数显示,包括 case.names(fm)、model.frame(fm)、model.matrix(fm)、cooks.distance(fm)、hatvalues(fm )、影响(fm)、情节(fm)等,因此非常希望使用它们。这确实是该软件的工作方式,因此强烈建议使用案例名称方法来简化所有内容。

1) 因此,如果国家名称是案例的唯一标识符,那么只需将它们分配给行名称,它们就可以作为案例名称来维护。我们省略了USA 以使示例更难,因为它不会像UK 那样出现在最后,如果我们使用UK,它可能只会给出前两个案例名称。

df <- data.frame(a = c(1,2,3),  b = c(2,3,1000), country = c("Malawi", "USA","UK"))

rownames(df) <- df$country

fm <- lm(a ~ b, df)
fm2 <- update(fm, subset = country != "USA")  # omit USA
# or:  update(fm, subset = case.names(fm) != "USA")

case.names(fm2)
## [1] "Malawi" "UK"    

2) 尽管 (1) 似乎更可取,但即使我们不将国家列分配给行名,另一种可行的可能性是在原始数据框中查找案例名称:

df <- data.frame(a = c(1,2,3),  b = c(2,3,1000), country = c("Malawi", "USA","UK"))

fm <- lm(a ~ b, df)
fm2 <- update(fm, subset = country != "USA")  # omit USA

df[ case.names(fm2), ]
##   a    b country
## 1 1    2  Malawi
## 3 3 1000      UK

或作为一个函数:

# first arg is lm object
# second arg is full data frame - data frame used in lm call if unspecified
# third arg is envir where full data frame stored - current envir if unspecified
extractData <- function(mod, data, envir = parent.frame()) {
  if (missing(data)) data <- eval(mod$call$data, envir)
  data[ case.names(mod), ]
}

# test

extractData(fm2)
##   a    b country
## 1 1    2  Malawi
## 3 3 1000      UK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多