所以让我解释一下我的目标。
(1) 我有一个现有的glm,它有P个输入变量,其中一个变量被命名为'X'。
(2) 我有多个来自不同系统的数据集,每个数据集都包含'X'输入变量,但名称不同。当我从系统中提取数据集后,就能知道与'X'对应的变量名称。
(3) 我想使用 predict(*)
R函数来处理每个数据集。我想知道是否有办法在不将输入变量重命名为 "X "的情况下做到这一点,比如添加一个参考列名,使之成为 "X"。predict
函数可以读取代替原始列名。我想如果没有办法,我需要创建一个临时数据集,将输入变量重命名为'X',因为我不想修改原数据集中的列名。
(4 额外的)我想解决同样的问题,但用多个glm与相同的输入变量'X'用不同的名字。
谢谢你
我不确定我是否正确理解了你的意思,但听起来好像你希望能够使用 "X "这个变量。predict.glm
其中 newdata
参数包含一个独立变量,这个独立变量的命名与用于创建数据框架中的等价独立变量不同。glm
. 然而,你不希望在新的数据框架中重命名列。
一种方法是为以下数据创建一个包装器 predict
读取新数据框架中要替换的变量名称,以及它所代表的模型中的变量名称。让我们称它为 predict2
:
predict2 <- function(model, newdata, oldvar, newvar, ...)
{
if(!missing(oldvar) & !missing(newvar))
{
oldname <- deparse(substitute(oldvar))
names(newdata)[which(names(newdata) == deparse(substitute(newvar)))] <- oldname
}
predict.glm(model, newdata = newdata, ...)
}
现在让我们来看看这将如何运作。你还没有给我们一个可重复的例子,但这里有一个非常简单的例子。这只是一个三层因子变量的逻辑回归,叫作 "三层因子"。X
:
set.seed(69)
df1 <- data.frame(outcome = rbinom(15, 1, rep(c(.1, .5, .9), each = 5)),
X = rep(LETTERS[1:3], each = 5))
mod <- glm(outcome ~ X, df1, family = binomial)
predict(mod)
#> 1 2 3 4 5 6
#> -19.5660685 -19.5660685 -19.5660685 -19.5660685 -19.5660685 -0.4054651
#> 7 8 9 10 11 12
#> -0.4054651 -0.4054651 -0.4054651 -0.4054651 1.3862944 1.3862944
#> 13 14 15
#> 1.3862944 1.3862944 1.3862944
现在,如果我们创建一个新的数据框架,其中因子变量称为 Y
,它只包含B,当我们尝试使用我们的模型时,我们会遇到一个问题。
df2 <- data.frame(outcome = rbinom(15, 1, .5), Y = rep('B', 15))
predict(mod, newdata = df2)
#> Error in eval(predvars, data, env): object 'X' not found
然而,有了我们的新函数 predict2
,我们只是告诉它使用 Y
代替 X
,我们应该得到我们的结果(因为它们都是B,所以应该都是-0.4054651。
predict2(mod, newdata = df2, oldvar = X, newvar = Y)
#> 1 2 3 4 5 6 7
#> -0.4054651 -0.4054651 -0.4054651 -0.4054651 -0.4054651 -0.4054651 -0.4054651
#> 8 9 10 11 12 13 14
#> -0.4054651 -0.4054651 -0.4054651 -0.4054651 -0.4054651 -0.4054651 -0.4054651
#> 15
#> -0.4054651
创建于2020-05-10,作者: 重读包 (v0.3.0)