在excel vs R中舍入会改变混合模型的结果



有人知道excel存储小数的方式有什么不同吗?为什么从R保存的值在加载回R时略有不同?似乎excel最多可以存储15个小数点,那么R呢?

我有一个数据集,有很多值,在R中显示6个小数点,我在lme4中使用它们进行分析。但我注意到,在相同的数据集(保存在两个不同的文件中),模型有时收敛,有时不收敛。我能把问题缩小到excel改变值的方式,但我不知道该怎么做。

我有一个像这样的数据框架:

head(Experiment1)
Response           First.Key     logResponseTime 
1         TREE             2345           3.370143 
2         APPLE             927           2.967080 
3         CHILD             343           2.535294       
4         CAT               403           2.605305       
5         ANGEL             692           2.840106       
6         WINGS             459           2.661813 

通过计算First的log10得到log RT。关键

然后将其保存到csv文件中,并再次加载df,得到

head(Experiment2)
Response           First.Key     logResponseTime 
1         TREE             2345           3.370143 
2         APPLE             927           2.967080 
3         CHILD             343           2.535294       
4         CAT               403           2.605305       
5         ANGEL             692           2.840106       
6         WINGS             459           2.661813

完全相同的值,最多6小数点

但是接下来发生了


Experiment1$logResponseTime - Experiment2$logResponseTime
1                                             2.220446e-15
2                                            -2.664535e-15
3                                             4.440892e-16
4                                            -4.440892e-16
5                                            -2.220446e-15
6                                             8.881784e-16

这些差异很小,但它们在我以前的模型中区分了收敛和非收敛,其中logResponseTime是DV,这就是我担心的原因。

是否有一种方法可以将R数据框保存到excel中,以不进行这些更改的格式(我使用write.csv)?更重要的是,为什么这种微小差异在lme有影响吗?

这些小的舍入是很难避免的;大多数情况下,不值得尝试修复它们(一般来说,这种程度的错误在任何使用浮点值的计算机系统中都是普遍存在的)。

很难确切地说出四舍五入和非四舍五入的分析之间的差异是什么,但你应该意识到,收敛问题的诊断是基于最大似然估计和其他相关数量的梯度大小的特定数值阈值。假设阈值为0.002,使用未舍入值运行模型会得到0.0019的梯度,而使用舍入值运行模型会得到0.0021的梯度。然后你的模型就会"收敛"在一种情况下和"无法收敛";在另一种情况下。我可以理解,仅仅通过将数据保存到CSV(或XLSX)文件并从中恢复数据,就可以得到稍微不同的值,这可能会带来不便,但您也应该意识到,即使在不同的操作系统上运行相同的模型,也可能产生同样大的差异。我的建议:

  • 检查四舍五入和未四舍五入结果之间的重要差异有多大("重要差异")在你的分析中,你所关心的估计值的差异,其大小足以改变你的结论)
  • 如果这些都很小,你可以稍微增加收敛检查的容差,这样它们就不会打扰你,例如使用control = lmerControl(check.conv.grad = .makeCC("warning", tol = 6e-3, relTol = NULL))(默认容差是2e-3,参见?lmerControl)
  • 如果这些是大的,那应该关注你-这意味着你的模型拟合是非常不稳定的。你可能也应该尝试运行allFit(),看看当你使用不同的优化器时,差异有多大。
  • 可能能够使用这里描述的方法使你的读/写流程更精确一点。
  • 如果可能的话,你可以将你的数据保存到.rds.rda文件,而不是CSV,这将保持完整的精度。

最新更新