You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在DolphinDB中用sqlCol多列调用ols时为何出现维度不匹配错误?

在DolphinDB中使用元编程sql函数执行多元回归报错的解决方法

问题描述

在DolphinDB中尝试用元编程函数sql对多列执行多元回归时出现错误,原脚本如下:

sql(sqlColAlias(makeUnifiedCall(toArray, makeUnifiedCall(ols, (sqlCol(`rr), sqlCol(t.columnNames()[12:16]), false, 0))), `param), from=t.nullFill(0.0), groupBy=sqlCol(`month`symbol)).eval() 

错误信息:

::evaluate(sql(sqlColAlias(makeUnifiedCall(toArray, makeUnifiedCall(ols, (sqlCol("rr"), sqlCol(::columnNames(t)[12 : 16]), 0, 0))), "param"), ::nullFill(t, 0), , sqlCol(["month","tsymbol"]))) => The dimension of dependent doesn't match the dimension of independent factors.

但将ols替换为rowSum后,多列计算可正常运行:

sql(sqlColAlias(makeUnifiedCall(rowSum, sqlCol(t.columnNames()[12:16])), `newCol), t.nullFill(0.0)).eval() // Outputs normally

问题原因

rowSum是逐行计算的函数,而ols是分组聚合计算的函数,二者在元编程中的调用逻辑完全不同:

  • rowSum配合makeUnifiedCall时,sqlCol(t.columnNames()[12:16])会把指定列作为逐行的输入数组,符合函数要求;
  • ols需要的是整个分组内的因变量列和自变量列集合,但原脚本中用sqlCol传递自变量列,相当于把每一行的多列值作为自变量输入,导致维度不匹配报错。

解决方法

调整ols在元编程中的调用方式,直接传递列名集合给ols,而非用sqlCol包装,具体修改如下:

正确脚本

sql(
    sqlColAlias(makeUnifiedCall(ols, sqlCol(`rr), t.columnNames()[12:16], false, 0), `param),
    from=t.nullFill(0.0),
    groupBy=sqlCol(`month`symbol)
).eval()

修改说明

  1. 移除toArray包装:ols本身会处理多列自变量,不需要额外转数组;
  2. 自变量直接传列名字符串数组t.columnNames()[12:16],而非sqlCol(...):这样ols会在每个分组中获取整列数据进行回归计算,保证因变量(整列rr)和自变量(整列集合)的维度匹配;
  3. 保留makeUnifiedCall用于包装ols的参数,适配元编程的函数调用逻辑。

内容的提问来源于stack exchange,提问作者Polly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:57:10