我需要在一个相对较大的数据框架上运行逻辑回归,其中包含480个条目和3个固定效果变量.固定效应var A有3233级,var B有2326级,var C有811级.总而言之,我有6370个固定效果.数据是横截面的.如果我不能使用正常glm函数运行此回归,因为回归矩阵对于我的记忆来说似乎太大了(我得到消息" Error: cannot allocate vector of size 22.9 Gb").我正在寻找在我的Macbook Air(OS X 10.9.5 8GB RAM)上运行此回归的替代方法.我也可以访问具有16GB RAM的服务器.
我试过用几种不同的方法解决这个问题,但到目前为止还没有取得令人满意的结果:
LFE/felm:使用的felm回归函数lfe包减去运行回归之前固定的效果.这完美地工作,并允许我在几分钟内将上述回归作为正常线性模型运行.但是,lfe不支持逻辑回归和glms.所以felm非常适合了解不同模型的模型拟合,但不适用于最终的逻辑回归模型.
biglm/bigglm:我想过bigglm用来将我的功能分解成更易于管理的块.然而,若干来源(例如link1,link2,link3)提到为了使其起作用,因子级别需要在块之间保持一致,即每个块必须包含每个因子变量的每个因子中的至少一个.因子A和B包含仅出现一次的级别,因此我无法将这些集合拆分为具有一致级别的不同块.如果我删除固定效应A的10个因子和B的8个因子(微小的变化),我将只剩下4个级别的因子,并且将我的数据分成4个块将使其更易于管理.然而,我仍然需要弄清楚如何对我的df进行排序,以确保我的480.000条目被分类为4个块,其中3个因子中的每个因子的每个因子级别出现至少一次.
GlmmGS/glmgs:glmmgs具有相同名称的包中的函数执行固定效果减法,如lfe使用"Gauss-Seidel"算法的逻辑回归包.不幸的是,该包已不再开发.对R来说比较新,没有深入的统计经验,我无法理解输出,也不知道如何以一种能给我正常"效果大小","模型拟合","模型拟合"的方式对其进行转换.显着性区间"glm回归摘要提供的指标.
我给包的作者发了一条消息.他们回应如下:
该包不提供与glm对象相同格式的输出.但是,在给定当前输出的情况下,您可以轻松计算大部分拟合统计量(估计的标准误差,拟合度)(在CRAN版本中,我相信当前输出是系数估计的向量,以及相关的向量标准误差;协方差分量相同,但如果你没有随机效应拟合模型,你不必担心它们).只要注意用于计算标准误差的协方差矩阵是与Gauss-Seidel算法相关的精度矩阵的对角线块的倒数,因此它们倾向于低估联合似然的标准误差.我不再维护包裹,我没有时间详细说明; 包装背后的开创性理论可以在手册中引用的论文中找到 ,其他一切都需要用笔和纸来制定:).
如果任何人都可以解释如何"轻松计算大部分拟合统计数据",使得没有任何统计学教育的人能够理解它(可能是不可能的)或者提供R代码,以示例如何实现这一点,我将是非常感谢!
Revolution Analytics:我在一台模拟Mac上的Windows 7的虚拟机上安装了革命分析企业.该程序具有一个被调用的函数RxLogit,该函数针对大型逻辑回归进行了优化.使用RxLogit我得到的功能the error (Failed to allocate 326554568 bytes. Error in rxCall("RxLogit", params) : bad allocation),所以该功能似乎也遇到了内存问题.但是,该软件使我能够在分布式计算集群上运行回归.所以我可以通过在具有大量内存的集群上购买计算时间来"解决问题".但是,我想知道革命分析程序是否提供了我不知道的任何公式或方法,这将允许我做某种类似的lfe固定效果减法操作或类似的bigglm …
"句柄"是指操纵多列数据行.R如何与Excel,SPSS,SAS等工具叠加?R是查看"大数据"(数亿到数十亿行)的可行工具吗?如果不是,哪种统计编程工具最适合分析大数据集?
我试图在mongoDB中存储一组双打和整数(大约15-20)的记录.大多数记录(99.99%)具有相同的结构.
当我将数据存储在一个非常结构化的数据存储格式的根目录中时,该文件大约为2.5GB,用于2250万条记录.但是,对于Mongo,数据库大小(来自命令show dbs)大约为21GB,而数据大小(来自db.collection.stats())大约为13GB.
这是一个巨大的开销(澄清:13GB对2.5GB,我甚至没有谈论21GB),我想这是因为它存储了两个keys和values.所以问题是,Mongo为什么以及如何在缩小它时做得更好?
但主要问题是,这对性能有何影响?我有4个索引,它们的价格是3GB,因此如果我将数据量增加一倍并尝试在内存中保留大量工作集,那么在单个8GB机器上运行服务器会成为一个问题.
如果我应该使用SQL或其他数据库,任何猜测?或者如果有人尝试过,可能只是继续使用ROOT文件?
我需要生成一个非常大的文本文件.每一行都有一个简单的格式:
Seq_num<SPACE>num_val
12343234 759
Run Code Online (Sandbox Code Playgroud)
我们假设我将生成一个包含1亿行的文件.我尝试了两种方法,令人惊讶的是它们提供了非常不同的时间性能.
对于超过100米的循环.在每个循环中我创建短字符串seq_num<SPACE>num_val,然后我将其写入文件.这种方法需要花费很多时间.
## APPROACH 1
for seq_id in seq_ids:
num_val=rand()
line=seq_id+' '+num_val
data_file.write(line)
Run Code Online (Sandbox Code Playgroud)对于超过100米的循环.在每个循环中我创建短字符串seq_num<SPACE>num_val,然后将其附加到列表中.当循环结束时,我迭代列表项并将每个项写入文件.这种方法花费的时间少得多.
## APPROACH 2
data_lines=list()
for seq_id in seq_ids:
num_val=rand()
l=seq_id+' '+num_val
data_lines.append(l)
for line in data_lines:
data_file.write(line)
Run Code Online (Sandbox Code Playgroud)注意:
所以方法1必须花费更少的时间.什么提示我缺少什么?
我有这样的数据结构:
struct X {
float value;
int id;
};
Run Code Online (Sandbox Code Playgroud)
那些矢量(大小为N(思考100000),按值排序(在程序执行期间保持不变):
std::vector<X> values;
Run Code Online (Sandbox Code Playgroud)
现在,我想写一个函数
void subvector(std::vector<X> const& values,
std::vector<int> const& ids,
std::vector<X>& out /*,
helper data here */);
Run Code Online (Sandbox Code Playgroud)
填充所述出用的排序子集的参数值由所传递的给定的,IDS(大小中号 < Ñ(约0.8倍Ñ)),快速(存储器是不是一个问题,这将被重复进行的,因此构建lookuptables(该来自函数参数的辅助数据)或只做一次的其他东西完全没问题.
到目前为止我的解决方案:
构建可查找的lut包含id - > offset in values(准备,所以常量运行时)
创建std::vector<X> tmp,大小N,填充
每个id的无效ID(线性为N)
,复制values[lut[id]]到tmp[lut[id]](M中的线性)
循环tmp,将项目复制到输出(N中的线性) …
我的目标实际上是将数据库的所有数据转储到XML文件中.数据库不是很大,大约300MB.问题是我的内存限制只有256MB(在JVM中).所以显然我不能把所有内容都读到内存中.
我设法使用iBatis解决了这个问题(是的,我的意思是iBatis,而不是myBatis)通过getList(... int skip, int max)多次调用它来增加skip.这确实解决了我的记忆问题,但我并没有对速度印象深刻.变量名称表明该方法的作用是读取整个结果集跳过然后指定的记录.这听起来对我来说是多余的(我不是说这是方法正在做什么,我只是猜测基于变量名称).
现在,我切换到myBatis 3以获取我的应用程序的下一个版本.我的问题是:有没有更好的方法来处理myBatis中的大块数据块?反正是为了让myBatis处理前N个记录,将它们返回给调用者,同时保持结果集连接打开,这样下次用户调用getList(...)时它将开始从N + 1记录中读取而不做任何记录"退出"?
我使用64位matlab和32g RAM(你知道的).
我有一个130万个数字(整数)的文件(向量).我想制作另一个相同长度的矢量,其中每个点是整个第一个矢量的加权平均值,加权距离该位置的反距离(实际上它的位置是^ -0.1,不是^ -1,但是出于示例目的) .我不能使用matlab的'过滤'功能,因为它只能在当前点之前平均事物,对吧?为了更清楚地解释,这里有3个元素的例子
data = [ 2 6 9 ]
weights = [ 1 1/2 1/3; 1/2 1 1/2; 1/3 1/2 1 ]
results=data*weights= [ 8 11.5 12.666 ]
i.e.
8 = 2*1 + 6*1/2 + 9*1/3
11.5 = 2*1/2 + 6*1 + 9*1/2
12.666 = 2*1/3 + 6*1/2 + 9*1
Run Code Online (Sandbox Code Playgroud)
因此,新矢量中的每个点都是整个第一个矢量的加权平均值,加权1 /(距该位置的距离+ 1).
我可以重新制作每个点的权重向量,然后逐个元素计算结果向量,但这需要130万次for循环迭代,每个迭代包含130万次乘法.我宁愿使用直接矩阵乘法,将1x1.3mil乘以1.3milx1.3mil,这在理论上是有效的,但我无法加载大的矩阵.
然后我尝试使用shell脚本制作矩阵并在matlab中对其进行索引,因此一次只调用矩阵的相关列,但这也需要很长时间.
我没有必要在matlab中这样做,所以人们对利用如此大的数字和获得平均值的任何建议将不胜感激.因为我使用的是^ -0.1的重量,而不是^ -1,所以它不会快速下降 - 百万分之一点仍然加权为0.25,而原始点加权为1,所以我不能只是削减它因为它变大了.
希望这很清楚吗?
以下是答案的代码(因此可以格式化?):
data = load('/Users/mmanary/Documents/test/insertion.txt');
data=data.';
total=length(data);
x=1:total;
datapad=[zeros(1,total) data];
weights = ([(total+1):-1:2 1:total]).^(-.4);
weights = …Run Code Online (Sandbox Code Playgroud) 想象一下,你有以下整数数组:
array(1, 2, 1, 0, 0, 1, 2, 4, 3, 2, [...] );
Run Code Online (Sandbox Code Playgroud)
整数最多可达一百万条; 它们不是硬编码而是预先生成并存储在JSON格式的文件中(大小约为2MB).这些整数的顺序很重要,我不能每次都随机生成它,因为它应该是一致的,并且在相同的索引处始终具有相同的值.
如果这个文件之后在PHP中被回读(例如使用file_get_contents+ json_decode),则需要700到900毫秒来恢复数组 - "好的"我想,"它可能是合理的,因为json_decode必须解析大约200万个字符,让我们缓存它" .APC将其缓存在大约68MB的条目中,可能正常,zval很大.然而从APC取回这个阵列也需要一些好的600毫秒,这在我眼中仍然太多了.
编辑:APC确实序列化/反序列化以存储和检索具有一百万个项目数组的内容是一个漫长而繁重的过程.
所以问题:
如果我打算在PHP中加载一百万条数组,无论是数据存储还是方法,我都应该期待这种延迟吗?据我所知,APC存储zval本身,所以理论上从APC中检索它应该尽可能快(没有解析,没有转换,没有磁盘访问)
为什么APC对于看似简单的事情这么慢?
有没有有效的方法使用PHP在内存中完全加载一百万个条目数组?假设RAM使用不是问题.
如果我只根据索引访问这个数组的片段(例如将块从索引15加载到索引76)并且实际上从未将整个数组放在内存中(是的,我知道这是理智的做法,但是我想知道所有方面),整个阵列最有效的数据存储系统是什么?显然不是RDBM; 我在想redis,但我很乐意听到其他想法.
我有一个庞大的艺术家,专辑和曲目数据库.这些项目中的每一个都可以通过胶合表(track_attributes,album_attributes,artist_attributes)分配一个或多个标签.每种物品类型都有数千(甚至数十万)个标签.
我正在尝试完成两项任务,而且我很难让查询执行得令人满意.
任务1)获取具有任何给定标签(如果提供)的所有曲目,这些曲目由具有任何给定标签(如果提供)的专辑上具有任何给定标签(如果提供)的艺术家提供.任何一组标签可能都不存在(即只有一个曲目标签处于活动状态,没有艺术家或专辑标签)
变化:结果也可以由艺术家或专辑而不是曲目呈现
任务2)获取应用于前一个过滤器结果的标签列表,以及每个给定标签的轨道数.
我所追求的是一些方法的一般指导.我已经尝试过临时表,内部联接,IN(),到目前为止我所做的所有努力都会导致响应缓慢.我在这里看到的结果的一个很好的例子可以在这里看到:http://www.yachtworld.com/core/listing/advancedSearch.jsp,除了他们只有一层标签,我正在处理三个.
表结构:
Table: attribute_tag_groups
Column | Type |
------------+-----------------------------+
id | integer |
name | character varying(255) |
type | enum (track, album, artist) |
Table: attribute_tags
Column | Type |
--------------------------------+-----------------------------+
id | integer |
attribute_tag_group_id | integer |
name | character varying(255) |
Table: track_attribute_tags
Column | Type |
------------+-----------------------------+
track_id | integer |
tag_id | integer |
Table: artist_attribute_tags
Column | Type |
------------+-----------------------------+
artist_id …Run Code Online (Sandbox Code Playgroud) large-data ×10
performance ×3
matlab ×2
php ×2
r ×2
algorithm ×1
apc ×1
average ×1
c++ ×1
convolution ×1
database ×1
fft ×1
file-io ×1
java ×1
join ×1
large-files ×1
microsoft-r ×1
mixed-models ×1
mongodb ×1
mybatis ×1
python ×1
sorting ×1
sql ×1
vector ×1