Cor*_*one 11 r lm data.table
好的,这是一个奇怪的.我怀疑这是一个内部的错误data.table
,但是如果有人能够解释为什么会发生这种情况会有用 - 这究竟是update
做什么的?
我正在使用list(list())
里面的技巧data.table
存储适合的模型.当您lm
为不同的分组创建一系列对象,然后创建update
这些模型时,所有模型的模型数据将成为最后一个分组的模型数据.这似乎是一个参考是挂在应该已经制作副本的地方,但我找不到哪里,我无法重现这个lm
和update
.
具体例子:
从虹膜数据开始,首先使三种不同的样本大小,然后将lm
模型拟合到每个物种,更新那些模型:
set.seed(3)
DT = data.table(iris)
DT = DT[rnorm(150) < 0.9]
fit = DT[, list(list(lm(Sepal.Length ~ Sepal.Width + Petal.Length))),
by = Species]
fit2 = fit[, list(list(update(V1[[1]], ~.-Sepal.Length))), by = Species]
Run Code Online (Sandbox Code Playgroud)
原始数据表具有不同数量的每个物种
DT[,.N, by = Species]
# Species N
# 1: setosa 41
# 2: versicolor 39
# 3: virginica 42
Run Code Online (Sandbox Code Playgroud)
第一次证实了这一点:
fit[, nobs(V1[[1]]), by = Species]
# Species V1
# 1: setosa 41
# 2: versicolor 39
# 3: virginica 42
Run Code Online (Sandbox Code Playgroud)
但更新的第二次适合显示所有型号的42
fit2[, nobs(V1[[1]]), by = Species]
# Species V1
# 1: setosa 42
# 2: versicolor 42
# 3: virginica 42
Run Code Online (Sandbox Code Playgroud)
我们还可以查看包含用于拟合的数据的model属性,并查看所有模型确实使用了最终的组数据.问题是这是怎么发生的?
head(fit$V1[[1]]$model)
# Sepal.Length Sepal.Width Petal.Length
# 1 5.1 3.5 1.4
# 2 4.9 3.0 1.4
# 3 4.7 3.2 1.3
# 4 4.6 3.1 1.5
# 5 5.0 3.6 1.4
# 6 5.4 3.9 1.7
head(fit$V1[[3]]$model)
# Sepal.Length Sepal.Width Petal.Length
# 1 6.3 3.3 6.0
# 2 5.8 2.7 5.1
# 3 6.3 2.9 5.6
# 4 7.6 3.0 6.6
# 5 4.9 2.5 4.5
# 6 7.3 2.9 6.3
head(fit2$V1[[1]]$model)
# Sepal.Length Sepal.Width Petal.Length
# 1 6.3 3.3 6.0
# 2 5.8 2.7 5.1
# 3 6.3 2.9 5.6
# 4 7.6 3.0 6.6
# 5 4.9 2.5 4.5
# 6 7.3 2.9 6.3
head(fit2$V1[[3]]$model)
# Sepal.Length Sepal.Width Petal.Length
# 1 6.3 3.3 6.0
# 2 5.8 2.7 5.1
# 3 6.3 2.9 5.6
# 4 7.6 3.0 6.6
# 5 4.9 2.5 4.5
# 6 7.3 2.9 6.3
Run Code Online (Sandbox Code Playgroud)
这不是答案,但是评论太久了
所述.Environment
的术语组分是对每个得到的模型相同
e1 <- attr(fit[['V1']][[1]]$terms, '.Environment')
e2 <- attr(fit[['V1']][[2]]$terms, '.Environment')
e3 <- attr(fit[['V1']][[3]]$terms, '.Environment')
identical(e1,e2)
## TRUE
identical(e2, e3)
## TRUE
Run Code Online (Sandbox Code Playgroud)
似乎对组的每个评估data.table
使用相同的内存位(我的非技术术语)j
(这很有效)。但是,当update
被调用时,它使用它来重新拟合模型。这将包含最后一组的值。
因此,如果您对此不满意,它将起作用
fit = DT[, { xx <-list2env(copy(.SD))
mymodel <-lm(Sepal.Length ~ Sepal.Width + Petal.Length)
attr(mymodel$terms, '.Environment') <- xx
list(list(mymodel))}, by= 'Species']
lfit2 <- fit[, list(list(update(V1[[1]], ~.-Sepal.Width))), by = Species]
lfit2[,lapply(V1,nobs)]
V1 V2 V3
1: 41 39 42
# using your exact diagnostic coding.
lfit2[,nobs(V1[[1]]),by = Species]
Species V1
1: setosa 41
2: versicolor 39
3: virginica 42
Run Code Online (Sandbox Code Playgroud)
不是长期的解决方案,至少是一种解决方法。
归档时间: |
|
查看次数: |
640 次 |
最近记录: |