【发布时间】:2013-06-06 03:45:01
【问题描述】:
在下面的最小示例中,我尝试在回归公式中使用字符串 vars 的值。但是,我只能将变量名称字符串(“v2+v3+v4”)传递给公式,而不是这个字符串的真正含义(例如,“v2”是 dat$v2)。
我知道有更好的方法来运行回归(例如,lm(v1 ~ v2 + v3 + v4, data=dat))。我的情况比较复杂,我想弄清楚如何在公式中使用字符串。有什么想法吗?
更新以下代码
# minimal example
# create data frame
v1 <- rnorm(10)
v2 <- sample(c(0,1), 10, replace=TRUE)
v3 <- rnorm(10)
v4 <- rnorm(10)
dat <- cbind(v1, v2, v3, v4)
dat <- as.data.frame(dat)
# create objects of column names
c.2 <- colnames(dat)[2]
c.3 <- colnames(dat)[3]
c.4 <- colnames(dat)[4]
# shortcut to get to the type of object my full code produces
vars <- paste(c.2, c.3, c.4, sep="+")
### TRYING TO SOLVE FROM THIS POINT:
print(vars)
# [1] "v2+v3+v4"
# use vars in regression
regression <- paste0("v1", " ~ ", vars)
m1 <- lm(as.formula(regression), data=dat)
更新:
@Arun 在第一个示例中关于 v1 上缺少的 "" 是正确的。这修复了我的示例,但我的真实代码仍然存在问题。在下面的代码块中,我调整了我的示例以更好地反映我的实际代码。我选择创建一个更简单的示例,起初我认为问题出在字符串vars。
这是一个不起作用的示例 :) 使用上面创建的相同数据框 dat。
dv <- colnames(dat)[1]
r2 <- colnames(dat)[2]
# the following loop creates objects r3, r4, r5, and r6
# r5 and r6 are interaction terms
for (v in 3:4) {
r <- colnames(dat)[v]
assign(paste("r",v,sep=""),r)
r <- paste(colnames(dat)[2], colnames(dat)[v], sep="*")
assign(paste("r",v+2,sep=""),r)
}
# combine r3, r4, r5, and r6 then collapse and remove trailing +
vars2 <- sapply(3:6, function(i) {
paste0("r", i, "+")
})
vars2 <- paste(vars2, collapse = '')
vars2 <- substr(vars2, 1, nchar(vars2)-1)
# concatenate dv, r2 (as a factor), and vars into `eq`
eq <- paste0(dv, " ~ factor(",r2,") +", vars2)
问题来了:
print(eq)
# [1] "v1 ~ factor(v2) +r3+r4+r5+r6"
与第一个示例中的 regression 不同,eq 不引入列名(例如,v3)。保留对象名称(例如,r3)。因此,下面的lm() 命令不起作用。
m2 <- lm(as.formula(eq), data=dat)
【问题讨论】:
-
我想你的意思是:
paste0("v1", " ~ ", vars). -
谢谢,@Arun。你说的对。现在我的示例运行了,但我的真实脚本仍然出现错误。事情看起来是一样的,但我知道我一定是在犯错误。如果我能找出差异,我会继续检查并再次发布。
-
在您发布的示例中,找不到
regressors。如果您可以编辑您的帖子以提供一个现在给出错误的示例,那就太好了。 -
lm(v1 ~ factor(v2) +r3+r4+r5+r6, data=dat)也不起作用。我认为您的意思是将r3等的内容而不是名称粘贴在一起。 -
@Aaron: 是的,我不知道如何让
eq返回r3(即v3)等的内容。eq只是给出了字符串r3+r4+r5+r6.
标签: r string formula paste names