【问题标题】:R lm using subset of my data frame with c(index)R lm 使用我的数据帧的子集和 c(index)
【发布时间】:2022-02-04 12:01:33
【问题描述】:

我有一个大数据框。前 n 列代表我的因变量,其余 m=(N-n) 列代表我的解释变量。

我需要进行变量选择,即我想运行一个线性模型,其中一个因变量与一组解释变量相对应。

我使用下面的代码,但它不起作用。

structure(list(y1 = c(-0.159526983540257, 2.16892194367082, 0.695539528415267, 
-0.841375527728487, 0.146186718603554), y2 = c(0.843930369507526, 
1.15189158283099, -0.162651238219114, 0.384543148695671, -0.768095169822086
), y3 = c(0.676606087565373, -1.54403120779262, 0.309217049561983, 
-1.35994467980478, 0.025666048887934), x1 = c(-0.462318888988991, 
0.637219370641707, 0.169306615605319, 0.773825637643689, -1.80512938432685
), x2 = c(0.420644990269304, 0.168496378157891, -0.288787457624397, 
-1.8207116669123, -1.04563859296061), x3 = c(0.529585006756937, 
-0.69696010268217, 0.72760512189806, 1.27475852051601, 0.0547933726620265
), x4 = c(0.995548762574541, -1.42396489630791, 1.34343306027338, 
1.14879495559021, 1.11600859581743), x5 = c(-0.989878720668274, 
-0.823824983427361, -1.58910626627862, -0.987929834373281, -1.75551410908407
), x6 = c(-0.206995723222616, -0.712762437418153, -0.516370544799284, 
0.124635650806358, 1.08149368199072), x7 = c(-0.409575294823497, 
1.5077513417679, -1.17700768734441, -0.159607245758965, 1.11768048557717
)), class = "data.frame", row.names = c(NA, -5L))   

    index=c(5,8,9)

    model = lm(df[,1] ~ df[,c(index)])

是否可以以类似的方式对数据框进行子集化?我真的很想避免使用列名,因为我可能会运行多个不同的模型。

编辑:c(index) 的长度可能每次都不同。

【问题讨论】:

  • 请按照r标签页面顶部的要求提供一个完整的可重现示例,以便其他人可以使用复制粘贴到他们的R会话中轻松运行代码。

标签: r subset linear-regression lm


【解决方案1】:

您可以使用重新制定:

index_y 是您的数据帧中感兴趣的 y 变量的索引df

model=lm(reformulate(colnames(df)[index],response=colnames(df)[index_y]),df)

【讨论】:

  • 我可以使用 response=colnames(df[,index_y]) 吗?
  • 我更新了我的答案以适应这个特定问题
【解决方案2】:

这行得通:

# Generating data.
n = 1000 # Use n for denoting number of observations, for consistency reasons!
k = 20 # k is used for independent/explanatory variables (also p often)!

set.seed(1986)

X = matrix(rnorm(n * k), ncol = k)
y = runif(n)

df = data.frame(y, X)
head(df)

# Fitting model on a subset of explanatory variables.
index = 4:10
model = lm(y ~ ., data = df[, index])
summary(model)

首先,我建议您关于符号:n 通常用于表示观察数,即行数(而不是列数),而 kp 用于解释变量。此外,解释变量和自变量是一回事 - 所以也许您的意思是要运行一个线性模型,其中我的一个因变量 变量针对一组解释变量

回到您的问题,我建议依靠lm() 函数中的可选参数data 仅传递您实际要使用的数据。通过这种方式,您可以使用公式y ~ .,它对您在我传入的data 中找到的所有其他变量回归y

作为最后的警告,我设置了index = 4:10。请注意,我没有使用从第四个到第十个的解释/自变量,而是从第三个到第九个,因为data 的第一列是y,即因变量(您必须始终包括在data)。

编辑

我看到您提供了一些可以使用的数据。这里如何适配代码:

# Fitting model on a subset of explanatory variables.
index=c(5,8,9)
model = lm(y1 ~ ., data = df[, c(1, index)]) # HERE I AM ADDING THE FIRST COLUMN!
summary(model)

基本上,您的index 包含具有因变量的列(在我的情况下为y1),或者您将其添加到可选参数data 中(就像我在示例中所做的那样)。

【讨论】:

  • 这当然有效。但是,它依赖于将所需的自变量命名为 y,这是我想避免的。正如我所提到的,我有多个自变量,因此稍后将它们命名为 y 可能会造成混淆。
  • 同样,ydependent 变量(它取决于 independent 变量)。此外,在您的示例代码中,您子集df[, y1],也就是说,实际上使用了所需因变量的名称。我可以调整代码以传递列名,但您仍然需要知道所需 y 变量的名称或位置 - 如果您不提供该信息,R 将无法知道必须解释哪个变量。
猜你喜欢
  • 2015-02-22
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2021-10-30
  • 2021-03-04
  • 2020-02-17
相关资源
最近更新 更多