使用rms::Predict在列上循环

使用rms::Predict在列上循环,r,R,我正在编写一个函数,以迭代方式遍历字符向量的每个元素,执行一些操作,并将每个输出附加到适当的列表中。在循环中,我正在做的一件事是使用字符列表的第I个元素作为参数。但我得到了以下错误: 预测错误(模型拟合,变量[i]):预测不在模型中:c(“[”,“变量”,“i”) 在对它进行了一些研究之后,我试图创建一个数据承诺,以便通过修改我的函数来引用vars向量的第I个元素:Predict(model_fit,substitute(vars[I],env=as.list(vars)),它输出一个关于预测器

我正在编写一个函数,以迭代方式遍历字符向量的每个元素,执行一些操作,并将每个输出附加到适当的列表中。在循环中,我正在做的一件事是使用字符列表的第I个元素作为参数。但我得到了以下错误:
预测错误(模型拟合,变量[i]):预测不在模型中:c(“[”,“变量”,“i”)
在对它进行了一些研究之后,我试图创建一个数据承诺,以便通过修改我的函数来引用vars向量的第I个元素:
Predict(model_fit,substitute(vars[I],env=as.list(vars))
,它输出一个关于预测器的类似错误消息不在模型中。关于如何正确编写代码以便
Predict()
函数准确引用所需的向量元素,有什么线索吗

下面是一个可复制的示例:

data(iris)
library(rms)

iris$binomial_species <- ifelse(iris$Species=='setosa',1,0)
vars <- colnames(iris)

dd <- datadist(iris)
options(datadist='dd')

for (i in seq(length(vars))) {
  fit <- lrm(binomial_species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,data = iris)
  Predict(fit,substitute(vars[i],env=as.list(vars))
}
数据(iris)
图书馆(rms)

iris$binominary\u species一个选项是建立对
Predict
eval
的调用。你没有将结果存储在任何地方,因此你可能应该将
Predict
的结果放在一个列表中。最简单的方法是
lappy
而不是循环。此外,你不需要每次循环都运行fit。La首先,您不能遍历所有
变量,因为它们包括“物种”(不在模型中)和“二项式物种”(因变量):

库(rms)
鸢尾$二项式种..$萼片.长度:num[1:200]4.6 4.61 4.63 4.64 4.65。。。
#>..$萼片宽度:num[1:200]3。。。
#>..$Petal.长度:num[1:200]4.354.354.354.354.354.354.354.354.354.354.35
#>..$Petal.Width:num[1:200]1.31.31.31.31.31.31.31.31.31.31.31.31.31.31.31.3。。。
#>..$yhat:num[1:200]-18.3-18.2-18.2-18.1-18.1。。。
#>..$lower:num[1:200]-429-425-422-419-415。。。
#>..$upper:num[1:200]392389 386 382 379。。。
#>..-attr(*,“out.attrs”)=2个列表
#>..$dim:Named int[1:4]200 1
#>(……等)

一个选项是建立对
Predict
eval
的调用。你没有将结果存储在任何地方,因此你可能应该将
Predict
的结果放在一个列表中。最简单的方法是
lappy
而不是循环。此外,你不需要每次循环都运行fit。最后,你不能这样做循环遍历所有
变量
,因为它们包括“物种”(不在模型中)和“二项式物种”(因变量):

库(rms)
鸢尾$二项式种..$萼片.长度:num[1:200]4.6 4.61 4.63 4.64 4.65。。。
#>..$萼片宽度:num[1:200]3。。。
#>..$Petal.长度:num[1:200]4.354.354.354.354.354.354.354.354.354.354.35
#>..$Petal.Width:num[1:200]1.31.31.31.31.31.31.31.31.31.31.31.31.31.31.31.3。。。
#>..$yhat:num[1:200]-18.3-18.2-18.2-18.1-18.1。。。
#>..$lower:num[1:200]-429-425-422-419-415。。。
#>..$upper:num[1:200]392389 386 382 379。。。
#>..-attr(*,“out.attrs”)=2个列表
#>..$dim:Named int[1:4]200 1
#>(……等)

如果要使用字符值作为列名,请使用
name=
参数。因此,这些参数都是相同的

Predict(fit, Sepal.Length)
Predict(fit, name="Sepal.Length")
myvar <- "Sepal.Length"
Predict(fit, name=myvar)
预测(适合,萼片长度)
预测(适合,name=“萼片长度”)

myvar如果您想使用字符值作为列名,请使用
name=
参数

Predict(fit, Sepal.Length)
Predict(fit, name="Sepal.Length")
myvar <- "Sepal.Length"
Predict(fit, name=myvar)
预测(适合,萼片长度)
预测(适合,name=“萼片长度”)

myvar感谢您的回复。您的评论是对的。但是,可复制的示例是我正在做的一个极其简化的版本,因此,我创建它只是为了复制错误消息。实际上,我正在存储我的
Predict()
结果,并且每次都需要重新拟合我的模型。@cliftjc1足够公平。“构建调用”方法对您有效吗?有可能
lappy
函数族是编写循环的一个很好的替代方法。您能详细介绍一下
eval()的逻辑吗
功能?请原谅我的无知,我不熟悉“建立呼叫”方法name@cliftjc1
as.call
部分允许您将语言对象列表转换为对函数的调用。我们将
Predict
、函数名作为列表中的第一个参数,然后将任何后续函数参数作为列表中的命名项。然后将其转换为带有
as.call
和final的调用ly
eval
或评估该调用。虽然这样做有效,但它并不像@MrFlick的回答那样简单和惯用(我不知道您可以使用
name=
),虽然我可能会将我答案的
lappy
部分作为您最终工作流程的一部分谢谢您的回答。您的评论是对的。然而,可复制的示例是我正在做的事情的一个极其简化的版本,因此,我创建它只是为了复制错误消息。实际上,我正在存储y
Predict()
结果,并且每次都需要重新拟合我的模型。@cliftjc1足够公平。“构建调用”方法对您有效吗?有可能
lappy
函数族是编写循环的一个很好的替代方法。您能详细介绍一下
eval()的逻辑吗
功能?请原谅我的无知,我不熟悉“建立呼叫”方法name@cliftjc1
as.call
部分允许您将语言对象列表转换为对函数的调用。我们将
Predict
、函数名作为列表中的第一个参数,然后将任何后续函数参数作为列表中的命名项。然后将其转换为带有
as.call
和final的调用ly
eval
或评估该调用。尽管此操作有效