【发布时间】:2020-12-07 00:32:50
【问题描述】:
我有一个数据集,我试图在其中循环一个因子变量 (location) 并为该因子的每个级别构建一个单独的模型。但是,根据location,存在单级因子变量,这给了我这个错误:
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
Called from: `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]])
因此,根据location,我想从模型中删除任何单级因子。我尝试将数据拆分为一个没有任何单级因子的数据集和另一个没有任何单级因子的数据集,但我不知道如何根据位置删除给定的因子变量。
这会给你错误:
library(data.table)
dt <- data.table(df, key = "location")
lapply(unique(dt$location), function(z) lm(y ~ x1 + x2 + x3 + x4 + x5, data = dt[J(z),]))
不过,我对 data.table 不太满意,因此任何非 data.table 解决方案都会非常有用。谢谢。
一些数据:
y <- rnorm(n = 100, mean = 50, 5)
x1 <- rnorm(n = 100, mean = 10, sd = 3)
location <- factor(c(rep(1, 20), rep(2, 20), rep(3, 20), rep(4, 20), rep(5, 20)))
x2 <- rnorm(n = 100, mean = 25, sd = 3)
x3 <- factor(sample(c(0, 1), size = 100, replace = TRUE))
x4 <- factor(ifelse(location == 1, 0,
ifelse(location == 2, sample(c(0, 1), size = 20, replace = TRUE),
ifelse(location == 3, 1,
ifelse(location == 4, 0, sample(c(0, 1), size = 20, replace = TRUE))))))
x5 <- factor(ifelse(location == 1, sample(c(0, 1), size = 20, replace = TRUE),
ifelse(location == 2, 1,
ifelse(location == 3, sample(c(0, 1), size = 20, replace = TRUE),
ifelse(location == 4, sample(c(0, 1), size = 20, replace = TRUE), 0)))))
df <- data.frame(y, location, x1, x2, x3, x4, x5)
【问题讨论】:
-
我尝试为每个位置级别运行您的
lm(...)公式。我认为您遇到了“对比”错误,因为您的某些x4和x5因素在每个位置没有两个或更多级别。例如,如果我运行lapply(unique(df$location), function(z) lm(y ~ x1 + x2 + x3, data = df[df$location==z,])),则它可以工作,但如果我运行lapply(unique(df$location), function(z) lm(y ~ x1 + x2 + x3 + x4, data = df[df$location==z,])),则它不会工作,后者包括+ x4。 -
是的,正是,我创建了示例数据来做到这一点。对不起,如果我的帖子不清楚。我得到了对比度错误,因为某些因子变量没有两个或更多级别,具体取决于位置。对于每个具有单级因子变量的位置,我想从该位置的模型中删除该因子变量。
-
哦,我想我可能看错了。我之前在另一个线程上发布了一个可能有帮助的解决方案:stackoverflow.com/a/64801181/6288065。这里的解决方案可能不需要其中的某些部分,但我认为如何通过不同的模型运行
lapply()的要点就在那里。如果不清楚,请告诉我。我可以在这里为您重新制定解决方案。 -
谢谢。我一直在尝试使用 lapply() 但实际数据集有两个以上“有问题”的因子变量,所以我一直在努力弄清楚。
标签: r