Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在线性回归中使用dataframe的列名作为预测变量_R_Regression - Fatal编程技术网

在线性回归中使用dataframe的列名作为预测变量

在线性回归中使用dataframe的列名作为预测变量,r,regression,R,Regression,我正在尝试循环遍历data.frame的所有列名并使用它们 作为线性回归中的预测变量 我目前拥有的是: for (i in 1:11){ for (j in 1:11){ if (i != j ){ var1 = names(newData)[i] var2 = names(newData)[j] glm.fit = glm(re78 ~ as.name(var1):as.name(var2), data=newData) summary(glm.fit) cv.glm(n

我正在尝试循环遍历data.frame的所有列名并使用它们 作为线性回归中的预测变量

我目前拥有的是:

for (i in 1:11){
for (j in 1:11){
if (i != j ){
  var1 = names(newData)[i]
  var2 = names(newData)[j]
  glm.fit = glm(re78 ~  as.name(var1):as.name(var2), data=newData)
  summary(glm.fit)
  cv.glm(newData, glm.fit, K = 10)$delta[1]
  }
 }
}
其中newData是my data.frame,共有11列。此代码给出了以下错误:

model.frame.default中出错(公式=re78~as.name(var1),数据=newData,: 变量“as.name(var1)”的类型(符号)无效


如何解决这个问题,并使其发挥作用?

您可以使用
fit看起来您需要使用两个变量的所有组合的模型。下面是另一种方法,使用内置的
mtcars
数据框进行说明,并使用
mpg
作为结果变量

我们使用
combn
combn
获取两个变量的所有组合(本例中不包括结果变量
mpg
),返回一个列表,其中每个列表元素是一个包含一对变量名称的向量。然后我们使用
map
(来自
purr
包)为每对变量创建模型并将结果存储在列表中

我们使用
reformate
构建模型公式。
.x
引用变量名称的向量(变量的每个元素)。例如,如果运行
reformate(粘贴(c(“cyl”、“disp”)、collapse=“*”、“mpg”)
,您可以看到
reformate
正在做什么

library(purrr)

# Get all combinations of two variables
vars = combn(names(mtcars)[-grep("mpg", names(mtcars))], 2, simplify=FALSE)
现在,我们希望对所有变量对运行回归模型,并将结果存储在列表中:

# No interaction
models = map(vars, ~ glm(reformulate(.x, "mpg"), data=mtcars))

# Interaction only (no main effects)
models = map(vars, ~ glm(reformulate(paste(.x, collapse=":"), "mpg"), data=mtcars))

# Interaction and main effects
models = map(vars, ~ glm(reformulate(paste(.x, collapse="*"), "mpg"), data=mtcars))
使用该模型的公式命名每个列表元素:

names(models) = map(models, ~ .x[["terms"]])
要使用
粘贴
而不是
重新格式化
创建模型公式,您可以执行以下操作(将
+
更改为
*
,具体取决于您希望包含的交互和主要效果的组合):

要查看此处如何使用
粘贴
,您可以运行:

paste("mpg ~", paste(c("cyl", "disp"), collapse=" * "))
以下是前两个模型在包含主要效果和交互作用时的样子:

models[1:2]
head(model_coefs, 8)
要评估模型输出,可以使用
broom
包中的函数。下面的代码返回数据帧,分别包含每个模型的系数和性能统计信息

library(broom)

model_coefs = map_df(models, tidy, .id="Model")
model_performance = map_df(models, glance, .id="Model")
以下是具有主要影响和交互作用的模型的结果:

models[1:2]
head(model_coefs, 8)

您使用
的方式可能不起作用。可能是您需要列名的索引,然后使用
粘贴
来创建公式刚才尝试了以下操作:glm.fit=glm(re78~as.name(var1),data=newData)仍然会给我同样的错误。我应该如何使用
粘贴
?我正在尝试循环两个变量的所有可能交互,看看哪一个给出了最低的估计预测错误。如果我尝试“粘贴”例如,将var1*var2放入公式中,这是如何做到的?在
paste0
中,var1*var2而不是var1为我提供了二进制运算符error.Argh的非数字参数,然后使用
as.formula(paste0(“re78~”,var1,:“,var2))
。使用
*
而不是
,是否确实不希望使用单个术语而不仅仅是交互术语?
             Model        term    estimate   std.error statistic      p.value
1 mpg ~ cyl * disp (Intercept) 49.03721186 5.004636297  9.798357 1.506091e-10
2 mpg ~ cyl * disp         cyl -3.40524372 0.840189015 -4.052950 3.645320e-04
3 mpg ~ cyl * disp        disp -0.14552575 0.040002465 -3.637919 1.099280e-03
4 mpg ~ cyl * disp    cyl:disp  0.01585388 0.004947824  3.204212 3.369023e-03
5   mpg ~ cyl * hp (Intercept) 50.75120716 6.511685614  7.793866 1.724224e-08
6   mpg ~ cyl * hp         cyl -4.11913952 0.988229081 -4.168203 2.672495e-04
7   mpg ~ cyl * hp          hp -0.17068010 0.069101555 -2.469989 1.987035e-02
8   mpg ~ cyl * hp      cyl:hp  0.01973741 0.008810871  2.240120 3.320219e-02