我有一个返回lm对象的函数.我想根据一些新数据生成预测值.新数据是一个data.frame,其格式与传递给lm函数的数据完全相同,只是响应已被删除(因为我们正在预测,而不是训练).我希望执行以下操作,但得到一个错误:
predict( model , newdata )
"Error in eval(expr, envir, enclos) : object 'ModelResponse' not found"
Run Code Online (Sandbox Code Playgroud)
就我而言,ModelResponse是我最初训练的数据中响应列的名称.所以只是为了踢,我试图插入NA响应:
newdata$ModelResponse = NA
predict( model , newdata )
Error in terms.default(object, data = data) : no terms component nor attribute
Run Code Online (Sandbox Code Playgroud)
非常令人沮丧!R的模型/回归概念与我的不匹配:1.我用一些数据训练模型并获得模型对象.2.我可以从任何环境/功能/框架等中获取新数据.只要我将数据输入到"看起来像"我训练过的数据的模型对象中(即相同的列名).这是一个标准的黑盒范例.
所以这是我的问题:
1.我在这里缺少什么概念?
2.如何让我的场景工作?
3.如何使模型对象可移植?str(model)告诉我模型对象保存了它训练的原始数据!所以模型对象是庞大的.我希望我的模型可以移植到任何功能/环境/等.并且只包含分数所需的数据.
在模型或模型提供的数据上没有str()时,这是我对此错误消息的猜测:
predict( model , newdata )
"Error in eval(expr, envir, enclos) : object 'ModelResponse' not found"
Run Code Online (Sandbox Code Playgroud)
我猜你创建了一个名为"model"的模型对象,你的结果变量(公式的左侧(在lm的原始调用中被命名为"ModelResponse")然后你在newdata中命名了一个列.同样的名字.但你应该做的是省略"ModelResponse"栏目(因为这是你所预测的)并放入"Model_Predictor1",Model_Predictor2"等......即右边的所有名字 -赋予lm()的公式的手边
coef()函数将允许您提取使模型可移植所需的信息.
mod.coef <- coef(model)
mod.coef
Run Code Online (Sandbox Code Playgroud)
由于您对rms/Hmisc包组合表示了兴趣Function,因此它使用了来自ols的帮助示例,并将输出与提取的函数和rms Predict方法进行比较.需要注意的首都,因为这些设计与封装等效工作lm和glm(..., family="binomial")和coxph,这成为有效值ols,lrm和cph.
> set.seed(1)
> x1 <- runif(200)
> x2 <- sample(0:3, 200, TRUE)
> distance <- (x1 + x2/3 + rnorm(200))^2
> d <- datadist(x1,x2)
> options(datadist="d") # No d -> no summary, plot without giving all details
>
>
> f <- ols(sqrt(distance) ~ rcs(x1,4) + scored(x2), x=TRUE)
>
> Function(f)
function(x1 = 0.50549065,x2 = 1) {0.50497361+1.0737604* x1-
0.79398383*pmax(x1-0.083887788,0)^3+ 1.4392827*pmax(x1-0.38792825,0)^3-
0.38627901*pmax(x1-0.65115162,0)^3-0.25901986*pmax(x1-0.92736774,0)^3+
0.06374433*x2+ 0.60885222*(x2==2)+0.38971577*(x2==3) }
<environment: 0x11b4568e8>
> ols.fun <- Function(f)
> pred1 <- Predict(f, x1=1, x2=3)
> pred1
x1 x2 yhat lower upper
1 1 3 1.862754 1.386107 2.339401
Response variable (y): sqrt(distance)
Limits are 0.95 confidence limits
# The "yhat" is the same as one produces with the extracted function
> ols.fun(x1=1, x2=3)
[1] 1.862754
Run Code Online (Sandbox Code Playgroud)
(我通过经验了解到,来自rms的受限制的三次样条拟合函数需要有空格并添加回车以提高可读性.)