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

R:构建线性模型时[[]和$之间的差异,r,linear-regression,R,Linear Regression,我正在使用lm()构建一个模型,并将其放入一个自定义函数中,以计算模型的RSS 但是我注意到$和[[]]分配响应变量是不同的: 模式1: mymodel1 <- lm(df$resp.var ~., data = df) summary(mymodel1) 当我检查系数时,响应变量(resp.var)被作为第二个模型中的预测因子之一 当我将模型更改为(在数据集中,响应变量位于第1列)时,得到了相同的消息: 我得到了这个信息: Error in model.frame.default(f

我正在使用
lm()
构建一个模型,并将其放入一个自定义函数中,以计算模型的RSS

但是我注意到
$
[[]]
分配响应变量是不同的:

模式1:

mymodel1 <- lm(df$resp.var ~., data = df)
summary(mymodel1) 
当我检查系数时,响应变量(
resp.var
)被作为第二个模型中的预测因子之一

当我将模型更改为(在数据集中,响应变量位于第1列)时,得到了相同的消息:

我得到了这个信息:

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){
  ...
}

selfun您只需要将列的名称传递给
lm
公式
参数,而不是数据向量。只需使用
resp.var~。
即可满足您的需要

如果
resp_var
是一个包含字符串和响应变量名称的变量,那么最好的方法是将
用作.formula

lm(as.formula(sprintf('%s ~ .', resp_var)), data = df)

您只需要将列的名称传递给
lm
formula
参数,而不是数据向量。只需使用
resp.var~。
即可满足您的需要

如果
resp_var
是一个包含字符串和响应变量名称的变量,那么最好的方法是将
用作.formula

lm(as.formula(sprintf('%s ~ .', resp_var)), data = df)

您只需要将列的名称传递给
lm
formula
参数,而不是数据向量。只需使用
resp.var~。
即可满足您的需要

如果
resp_var
是一个包含字符串和响应变量名称的变量,那么最好的方法是将
用作.formula

lm(as.formula(sprintf('%s ~ .', resp_var)), data = df)

您只需要将列的名称传递给
lm
formula
参数,而不是数据向量。只需使用
resp.var~。
即可满足您的需要

如果
resp_var
是一个包含字符串和响应变量名称的变量,那么最好的方法是将
用作.formula

lm(as.formula(sprintf('%s ~ .', resp_var)), data = df)

为什么不直接通过公式呢

selfun <- function(form,data){
  lm(form,data=data)
}

为什么不直接通过公式呢

selfun <- function(form,data){
  lm(form,data=data)
}

为什么不直接通过公式呢

selfun <- function(form,data){
  lm(form,data=data)
}

为什么不直接通过公式呢

selfun <- function(form,data){
  lm(form,data=data)
}

df[['resp.var']
df$resp.var
都返回相同的向量。这就是
$
-函数的定义方式。如果我没看错你的问题,你会想要
df[[resp.var]]
,因为resp.var的值听起来像是列名。您希望计算'resp.var'

如果您在给Paul的评论中提到“另一个错误消息”,那么您需要发布str(df)的输出和错误消息的全文


关于精确配合的警告消息与此无关。如果您得到准确的预测,
summary.lm
会发出警告,但如果没有数据,我们无法看到可能发生的情况。

这两个
df[['resp.var']]
df$resp.var
都返回相同的向量。这就是
$
-函数的定义方式。如果我没看错你的问题,你会想要
df[[resp.var]]
,因为resp.var的值听起来像是列名。您希望计算'resp.var'

如果您在给Paul的评论中提到“另一个错误消息”,那么您需要发布str(df)的输出和错误消息的全文


关于精确配合的警告消息与此无关。如果您得到准确的预测,
summary.lm
会发出警告,但如果没有数据,我们无法看到可能发生的情况。

这两个
df[['resp.var']]
df$resp.var
都返回相同的向量。这就是
$
-函数的定义方式。如果我没看错你的问题,你会想要
df[[resp.var]]
,因为resp.var的值听起来像是列名。您希望计算'resp.var'

如果您在给Paul的评论中提到“另一个错误消息”,那么您需要发布str(df)的输出和错误消息的全文


关于精确配合的警告消息与此无关。如果您得到准确的预测,
summary.lm
会发出警告,但如果没有数据,我们无法看到可能发生的情况。

这两个
df[['resp.var']]
df$resp.var
都返回相同的向量。这就是
$
-函数的定义方式。如果我没看错你的问题,你会想要
df[[resp.var]]
,因为resp.var的值听起来像是列名。您希望计算'resp.var'

如果您在给Paul的评论中提到“另一个错误消息”,那么您需要发布str(df)的输出和错误消息的全文


关于精确配合的警告消息与此无关。如果您得到了准确的预测,
summary.lm
会发出警告,但是如果没有数据,我们就看不到可能发生的情况。

因为您指定了
data=df
您只需键入
rep.var~。
在您的示例中,您使用
resp.var
rep.var
即可得到不同的结果。在StackOverflow中输入时是否存在简单的打字错误?还是你遇到了两个变量之间的差异?嗨@Thomas,这是我在问句中犯的一个错误。我已经改正了。谢谢:)由于您指定了
data=df
,您只需键入
rep.var~。
在您的示例中,您使用
resp.var
rep.var
即可得到不同的结果。在StackOverflow中输入时是否存在简单的打字错误?还是你遇到了两个变量之间的差异?嗨@Thomas,这是我在问句中犯的一个错误。我已经改正了。谢谢:)因为您指定了
data=df
,所以只需键入
rep.var~。
在您的示例中,您使用