我正在按块执行大型数据集块,在使用biglm函数时更新线性模型列表。当一个特定的块不包含我在线性模型中的所有因素时会出现问题,并且我收到此错误:
Error in update.biglm(model, new) : model matrices incompatible
update.biglm的描述提到所有块的因子级别必须相同。我可能想出一个解决方法来避免这种情况,但必须有一个更好的方法。在{biglm'页面上,This pdf提到“因素必须具备全套水平 指定的(不一定存在于数据块中)“。所以我认为有一些方法可以指定所有可能的级别,这样我就可以更新一个没有所有因素的模型,但我无法弄清楚如何做到这一点
这是一段代码来说明我的问题:
df = data.frame(a = rnorm(12),b = as.factor(rep(1:4,each = 3)),c = rep(0:1,6))
model = biglm(a~b+c,data = df
df.new = data.frame(a = rnorm(6),b = as.factor(rep(1:2,each = 3)),c =rep(0:1, 3))
model.new = update(model,df.new)
感谢您的任何建议。
答案 0 :(得分:2)
我也遇到过这个问题。在将大数据框中的变量分成块之前,它们是否被指定为因子?此外,数据集是否格式化为数据框?
large_df <- as.data.frame(large_data_set) # just to make sure it's a df.
large_df$factor.vars <- as.factor(large_df$factor.vars)
如果是这种情况,那么即使在将数据帧分成块之后,所有因子级别也应保留在因子变量中。这将确保biglm从第一次调用创建适当的设计矩阵,并且所有后续更新都将兼容。
如果从一开始就有不同的数据框(如您在示例中所示),也许您应该在分解成块之前将它们合并为一个。继续你的例子:
df.large <- rbind(df,df.new)
chunk1 <- df.large[1:12,]
chunk2 <- df.large[13:18,]
model <- biglm(a~b+c,data = chunk1)
model.new <- update(model,chunk2) # this is now compatible