我正在使用大量数据(5000万行)和biglm包创建线性模型。这是通过首先基于一块数据创建线性模型,然后通过读取更多数据块(1百万行)并使用'biglm'中的'update'函数来更新模型来完成的。我的模型使用年份(20个级别的因子),温度和1或0的因子变量is_paid。代码看起来像这样:
model = biglm(output~year:is_paid+temp,data = df) #creates my original model from a starting data frame, df
newdata = file[i] #This is just an example of me getting a new chunk of data in; don't worry about it
model = update(model,data = newdata) #this is where the update to the new model with the new data happens
问题是is_paid因子变量几乎总是0.所以有时当我读入一大块数据时,is_paid列中的每个值都将为0,我显然会收到以下错误:
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
所以基本上,我需要一种方法让模型接受更新而不会生气,因为在新的数据块中没有两个不同的因素。
我想要这样做的一种方法是始终为is_paid提供一行“1”值的实际数据,并将其添加到新的块中。这样,有多种因素,我还在添加实际数据。代码看起来像这样:
#the variable 'line' is a single line of data that has a '1' for is_paid
newdata = file[i] #again, an example of me reading in a new chunk of data. I know that this doesn't make sense by itself
newdata = rbind(line,newdata) #add in the sample line with '1' in is_paid to newdata
model = update(model,newdata) #update the data
以下是我的数据示例:
output year temp is_paid
1100518 12 40 0
2104518 12 29 0
1100200 15 17 0
1245110 16 18 0
5103128 14 30 0
以下是我的示例行示例,这是一个真实记录,其中is_paid为1:
output year temp is_paid
31200599 12 49 1
反复添加相同的行是否会扭曲我为变量得到的系数?我在一些虚拟代码上进行了测试,并且它看起来不像更新同一条记录的模型一遍又一遍地影响它,但我很怀疑。
我觉得有一种更加优雅和聪明的方式来做到这一点。我一直在阅读R教程,似乎有一种方法来设置lm模型的对比。我看了'lm'中的'对比'论点,但无法弄明白。我不认为你可以在biglm中设置对比,这是我需要使用的。我非常感谢你们能想到的任何见解或解决方案。
* is_paid的数字与因子变量的比较:
df.num = data.frame(a = c(1:10),b = as.factor(rep(c(1,2,3,4,5),each = 2)),c = c(rep(0,each = 5),rep(1,each = 5)))
df.factor = data.frame(a = c(1:10),b = as.factor(rep(c(1,2,3,4,5),each = 2)),c = as.factor(c(rep(0,each = 5),rep(1,each = 5))))
mod.factor = lm(a~b:c,data = df.factor)
mod.num = lm(a~b:c,data = df.num)
> mod.factor
Call:
lm(formula = a ~ b:c, data = df.factor)
Coefficients:
(Intercept) b1:c0 b2:c0 b3:c0 b4:c0 b5:c0 b1:c1
9.5 -8.0 -6.0 -4.5 NA NA NA
b2:c1 b3:c1 b4:c1 b5:c1
NA -3.5 -2.0 NA
Call:
lm(formula = a ~ b:c, data = df.num)
Coefficients:
(Intercept) b1:c b2:c b3:c b4:c b5:c
3.0 NA NA 3.0 4.5 6.5
这里的结论是,如果is_paid是数字,则模型会被更改。
****我还略微编辑了我的模型,而不是仅考虑两个因素的相互作用而不仅仅是三个变量。这意味着我不能将is_paid视为数字(我认为)
答案 0 :(得分:2)
将Ben Bolker的评论转化为答案,并提供了一些更好的模拟数据的证据。
只需连续处理您的两级因素。这与将其视为一个因素是一样的。
示例:
df.num = data.frame(a = rnorm(12),
b = as.factor(rep(1:4,each = 3)),
c = rep(0:1, 6))
df.factor = df.num
df.factor$c = factor(df.factor$c)
mod.factor = lm(a~b*c - 1,data = df.factor)
mod.num = lm(a~b*c - 1,data = df.num)
all(coef(mod.factor) == coef(mod.num))
# [1] TRUE