如何在DolphinDB中高效执行多列成对加权最小二乘回归?
DolphinDB 实现多列成对移动最小二乘回归(mslr)并生成指定格式结果
要实现多列成对的mslr计算并得到10行×6列的目标结果,核心是将每一对列的mslr结果拆分为单独的系数列,再横向合并。以下是两种高效实现方式:
方式1:直接拆分每对列的mslr结果(直观易读)
在SELECT语句中,对每一对列分别调用mslr,并将返回的2列系数(截距alpha、斜率beta)分别命名为目标列:
col1 = rand(10.0, 10) col2 = rand(10.0, 10) col3 = rand(10.0, 10) col4 = rand(10.0, 10) col5 = rand(10.0, 10) col6 = rand(10.0, 10) t = table(col1, col2, col3, col4, col5, col6) select mslr(col1, col4, 3)[0] as re1_a, mslr(col1, col4, 3)[1] as re1_b, mslr(col2, col5, 3)[0] as re2_a, mslr(col2, col5, 3)[1] as re2_b, mslr(col3, col6, 3)[0] as re3_a, mslr(col3, col6, 3)[1] as re3_b from t
- 说明:
mslr(x,y,window)返回包含2列的表,通过[0]和[1]可分别提取alpha和beta向量,直接作为结果列。
方式2:使用peach批量处理列对(高效可扩展)
当需要处理的列对数量较多时,用peach批量生成每对列的mslr结果表,再横向拼接所有表:
col1 = rand(10.0, 10) col2 = rand(10.0, 10) col3 = rand(10.0, 10) col4 = rand(10.0, 10) col5 = rand(10.0, 10) col6 = rand(10.0, 10) t = table(col1, col2, col3, col4, col5, col6) // 定义列对列表 xCols = [col1, col2, col3] yCols = [col4, col5, col6] // 批量生成每对列的mslr结果表并自动命名系数列 resultTables = peach( def(x, y, idx){ select mslr(x, y, 3) as `re${idx}_a`re${idx}_b from t }, xCols, yCols, 1..xCols.size() ) // 横向拼接所有结果表得到最终格式 finalResult = hconcat(resultTables...) finalResult
- 说明:
peach并行处理每一对列,生成对应系数表并按索引命名列(如re1_a、re1_b);hconcat将所有结果表横向拼接,得到10行×6列的目标格式。
错误原因分析
- 传入列列表调用
mslr报错:mslr仅接受单个数值向量作为X和Y参数,不支持向量列表输入; - 使用
each得到2行×6列结果:each在SELECT语句中会将每个mslr返回的表(10行2列)作为一个元素,最终将这些元素转置堆叠,导致结果维度不符合预期。
内容的提问来源于stack exchange,提问作者Stella.W
相关产品推荐
相关产品推荐

