在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()
修改说明
- 移除
toArray包装:ols本身会处理多列自变量,不需要额外转数组; - 自变量直接传列名字符串数组
t.columnNames()[12:16],而非sqlCol(...):这样ols会在每个分组中获取整列数据进行回归计算,保证因变量(整列rr)和自变量(整列集合)的维度匹配; - 保留
makeUnifiedCall用于包装ols的参数,适配元编程的函数调用逻辑。
内容的提问来源于stack exchange,提问作者Polly
相关产品推荐
相关产品推荐

