R:构建线性模型时[[]]和$之间的差异

时间:2014-05-19 10:35:44

标签: r linear-regression

我正在使用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,有没有办法实现呢?还是我弄错了?

3 个答案:

答案 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会发出警告,但如果没有数据,我们就无法看到可能发生的情况。