R glm - 如何从具有相同数据格式和值的两个不同数据集中预测相同系数
R glm - How to predict the same coefficient from two different dataset with the same data format and value
所以让我解释一下我的目标。
(1) 我有一个现有的带有 P 个输入变量的 glm,其中一个名为 'X'.
(2) 我有来自不同系统的多个数据集,每个数据集都包含 'X' 输入变量,但名称不同。从系统中提取数据集后,我就能知道对应于 'X'.
的变量名称
(3) 我想对每个数据集使用 predict(*)
R 函数。我想知道是否有一种方法可以在不将输入变量重命名为 'X' 的情况下执行此操作,例如添加 predict
函数可以读取的引用列名而不是原始列名。我想如果没有办法,我将需要创建一个临时数据集,并将输入变量重命名为 'X',因为我不想修改原始数据集中的列名称。
(4 Extra) 我想解决同样的问题,但是多个 glm 具有相同的输入变量 '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
由 reprex package (v0.3.0)
于 2020-05-10 创建
所以让我解释一下我的目标。
(1) 我有一个现有的带有 P 个输入变量的 glm,其中一个名为 'X'.
(2) 我有来自不同系统的多个数据集,每个数据集都包含 'X' 输入变量,但名称不同。从系统中提取数据集后,我就能知道对应于 'X'.
的变量名称(3) 我想对每个数据集使用 predict(*)
R 函数。我想知道是否有一种方法可以在不将输入变量重命名为 'X' 的情况下执行此操作,例如添加 predict
函数可以读取的引用列名而不是原始列名。我想如果没有办法,我将需要创建一个临时数据集,并将输入变量重命名为 'X',因为我不想修改原始数据集中的列名称。
(4 Extra) 我想解决同样的问题,但是多个 glm 具有相同的输入变量 '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
由 reprex package (v0.3.0)
于 2020-05-10 创建