我正在使用lm()
构建模型,并将其置于自定义函数中以计算模型的RSS。
但我注意到$
和[[ ]]
分配响应变量有所不同:
MODEL1:
mymodel1 <- lm(df$resp.var ~., data = df)
summary(mymodel1)
MODEL2:
mymodel2 <- lm(df[["resp.var"]] ~., data = df)
summary(mymodel2)
提交summary()
子句后会弹出警告消息:
Warning message:
In summary.lm(mymodel2) : essentially perfect fit: summary may be unreliable
当我检查系数时,响应变量(resp.var
)被视为第二个模型中的预测变量之一。
当我将模型更改为(在数据集中,响应变量位于第1列)时,我收到了相同的消息:
mymodel3 <- lm(df[,1] ~., data = df)
summary(mymodel3)
我还尝试直接传递resp.var
中的lm()
:
model4 <- lm(resp.var ~., data = df)
summary(mymodel4)
我收到了这条消息:
Error in model.frame.default(formula = resp.var ~ ., data = df, drop.unused.levels = TRUE) :
variable lengths differ (found for 'xxxx')
但我可以确保长度对齐......
因为resp.var是自定义函数的参数
selfun <- function(pred.var, resp.var){
...
}
我想在函数内部的模型中直接使用参数resp.var
,有没有办法实现呢?还是我弄错了?
答案 0 :(得分:2)
您只需要将列的名称传递给formula
的{{1}}参数,而不是数据向量。只需使用lm
即可获得所需内容。
如果resp.var ~ .
是包含带有响应变量名称的字符串的变量,最好的方法是使用resp_var
:
as.formula
答案 1 :(得分:1)
为什么不直接传递公式?
selfun <- function(form,data){
lm(form,data=data)
}
然后你简单地称之为:
selfun(resp.var~pred.var,data=df)
答案 2 :(得分:0)
df[['resp.var']]
和df$resp.var
都返回相同的向量。这就是$
- 函数的定义方式。如果我正确地阅读了您的问题,您需要df[[resp.var]]
,因为听起来resp.var的值是列名。你想要&#39; resp.var&#39;待评估。
如果您收到了另一条错误消息&#34;正如您在对Paul的评论中提到的那样,您需要发布str(df)的输出和错误消息的全文。
关于完全适合的警告信息与此任何内容无关。如果您得到准确的预测,summary.lm
会发出警告,但如果没有数据,我们就无法看到可能发生的情况。