gpt4 book ai didi

r - 为什么在分组 data.table 中的 lm 上使用更新会丢失其模型数据?

转载 作者:行者123 更新时间:2023-12-04 02:21:26 24 4
gpt4 key购买 nike

好吧,这是一个奇怪的。我怀疑这是内部的错误 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]

原始数据表每个物种的编号不同
DT[,.N, by = Species]
# Species N
# 1: setosa 41
# 2: versicolor 39
# 3: virginica 42

第一次拟合证实了这一点:
fit[, nobs(V1[[1]]), by = Species]
# Species V1
# 1: setosa 41
# 2: versicolor 39
# 3: virginica 42

但更新后的第二次拟合显示所有模型均为 42
fit2[, nobs(V1[[1]]), by = Species]
# Species V1
# 1: setosa 42
# 2: versicolor 42
# 3: virginica 42

我们还可以查看包含用于拟合的数据的模型属性,并看到所有模型确实都在使用最终组数据。问题是这是怎么发生的?
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

最佳答案

这不是答案,但评论太长了
.Environment因为对于每个结果模型,terms 组件是相同的

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

看来 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

不是长期解决方案,但至少是一种解决方法。

关于r - 为什么在分组 data.table 中的 lm 上使用更新会丢失其模型数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15096811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com