Skip to content

Releases: Maicarons/stats-flutter

Stats-flutter v1.5.0 · 语法语言与 PDF 导出

Choose a tag to compare

@Maicarons Maicarons released this 17 Oct 07:33

Stats-flutter v1.5.0 · 语法语言与 PDF 导出 / Scripting language & PDF export

v1.4.0 把统计口径理清之后,这一版补上两处「用得下去」的能力:数据页的语法编辑器补齐 PSPP 语法层(注释 / 宏 / INCLUDE / 定位 / .sps 往返),分析结果从「一份报告」变成会话级输出树,并补上长期缺的PDF 导出——纯 Dart 渲染、内置 2.3 MB 子集化中文字体,中文内容在屏幕 / HTML / PDF 三处一致。

App 版本 1.5.0+7,内置 statkit 0.5.1(本版未改动统计内核,数值与 v1.4.0 一致)。

亮点 / Highlights — M3:语法语言层

  • 注释按 PSPP 语义:* / COMMENT 持续到「行尾句点」或空行,而不是「本行剩余部分」;行内 /* … */ 剥离;整行注释会结束未闭合命令;漏写句点时给提示,而不是静默把后面的命令一起吃掉
  • 宏:DEFINE … !ENDDEFINE,位置参数 !POSITIONAL 与关键字参数、!TOKENS(n) / !CHAREND('/') / !CMDEND / !DEFAULT(值);宏函数 !CONCAT !QUOTE !UNQUOTE !UPCASE !LENGTH !SUBSTR !HEAD !TAIL !INDEX !EVAL !BLANKS !NULL;!LET / !IF !THEN !ELSE !ENDIF / !DO !TO !BY !DOEND;调用支持 !m a=1. 与 !m(1). 两种写法;重复定义覆盖,递归有深度上限
  • INCLUDE:被包含文件注入当前脚本一起执行、宏表延续;相对路径按当前 .sps 文件所在目录解析;循环包含报错,嵌套上限 16 层;包含文件出错即中止后续命令(PSPP 语义)
  • 定位:每条命令带起止位置,失败标注「第 N 行」可点击跳回源码;宏展开产生的命令能回溯到原始位置,不因展开丢行列信息
  • .sps 往返:打开先剥 UTF-8 BOM、非法字节替换为 U+FFFD 并提示数量;保存写出无 BOM 的 UTF-8,PSPP 可直接读取
  • 本版不做的可选宏构造(!DO !v !IN (…)、!ENCLOSE、!NOEXPAND / !OFFEXPAND / !ONEXPAND)明确报「未支持」,不静默忽略

亮点 / Highlights — M4:输出树与 PDF 导出

  • 会话级输出树:每次运行生成一张卡片,最新在前、默认只展开最新一张,可手动折叠;同一分析连跑多次不再互相覆盖(清空走「清空输出」按钮,带确认对话框)
  • 每张卡片:复制纯文本 / 分享 / 导出 PDF·HTML·Markdown;卡片右上角可删除,AppBar 的「导出全部输出 / 分享全部输出」把该分析的每张卡片合成为一份;v1.4 的分区导出菜单保留
  • PDF 导出(新增):pdf 纯 Dart 渲染(不引入 printing),A4 分页、页眉(标题 + 生成时间)、页脚「第 x / y 页」、表头跨页自动重复、数值列右对齐、p 值加星着色;导出期间显示进度提示
  • 内置中文字体:Google Fonts Noto Sans SC 子集化(wght=400 静态实例 + GB2312 常用字 + Latin + 标点),按 OFL 要求改名 StatsSansSC,实测 2.3 MB 随包分发(未子集的完整字重为 17 MB,故不采用);Latin 仍用 Inter,中文走 fontFallback。罕见字 / 繁体可能缺字(渲染为空白)
  • 变量与值标签:表格行 / 表头 / 标题 / 副标题优先显示变量标签与值标签,注释给出「标签 = 变量名」对应关系;数值列识别扩展到 <.001、≤0.05、1.2e-05、12.5%、1,204 等写法,并剔除行尾显著性星号
  • 共享样式收敛到 report_style.dart,屏幕 / HTML / PDF 三处的数值对齐、p 值格式与星号口径一致

文档 / Docs

  • 新增中英双语页面:语法语言(注释 / 宏 / INCLUDE / 定位 / .sps 往返)与输出与导出(输出树 / 三种格式 / 标签 / PDF 与字体说明)
  • 首页特性卡、README(中英)、分析页「导出」小节同步更新;docs:build 通过

质量 / Quality

  • dart analyze lib test:无问题
  • flutter test --exclude-tags "golden || benchmark":301 项;flutter test --tags golden:17 项(Windows 生成基线);packages/statkit 的 dart test:91 项
  • 新增测试:output_tree_test、report_style_test、report_pdf_test、report_labels_test;golden 用例补 OutputStore.reset(),修掉静态输出树在测试间串用的问题

构建环境 / Requirements

  • Flutter 3.41.9 stable(Dart SDK ^3.11.5)
  • statkit 0.5.1(v1.5.0 未改动统计内核;PDF 依赖 pdf ^3.12.0)

产物 / Artifacts

CI 会为本次发布构建并附加:Android APK、Windows x64(zip)、Linux x64(tar.gz)、macOS(zip)。


完整变更清单 / Full changelog:git log app-v1.4.0..app-v1.5.0

Stats-flutter v1.4.0 · 统计能力升级

Choose a tag to compare

@Maicarons Maicarons released this 17 Oct 00:43

Stats-flutter v1.4.0 · 统计能力升级 / Statistical capability upgrade

v1.3.1 收尾了表现层,这一版回到「会不会算、算得对不对」:统计内核 statkit 升到 0.5.0(新增 4 个过程、修掉 2 处缺陷),数据层补上 5 个 SPSS / PSPP 命令,并把「哪些个案参与计算」从零散实现收敛成一套写清楚、有对拍的口径。

注意:本版修正了若干统计口径(Levene 改为对组均值、Mann-Whitney 补结校正、多变量按个案对齐、二元 logistic 的 IRLS),与旧版本数值不同之处请以本版本为准,逐条见下方「口径修正」。

亮点 / Highlights — M1:statkit 0.5.0

  • 有序趋势检验 Jonckheere-Terpstra(分组本身有序时的单调趋势;结对计数 O(n log n)、含结校正方差、支持频数权重、单尾 p 在 extra['pOneTail'])
  • 置换检验:Permutation.random / Permutation.exact、两独立样本均值差、配对差;p 用 (1 + #{|s| ≥ |obs|}) / (1 + B)(Phipson & Smyth 2010),固定默认种子保证可复现,小样本可精确枚举
  • Lilliefors 校正的正态性检验 p(参数由样本估计时,原先的渐近 p 几乎不会拒绝)
  • 多项 logistic 回归(三分类及以上名义因变量,softmax + IRLS,Wald / OR)
  • 协方差分析 ANCOVA(控制协变量后的组间比较,Type III 平方和)
  • 新增过程均标注 @experimental:次版本内接口可能调整

亮点 / Highlights — M2:数据层命令

  • RANK 补全:/RANK /N /RFRACTION /PROPORTION /PERCENT /NORMAL /NTILES(k)、/TIES=MEAN|LOW|HIGH|CONDENSE、升 / 降序、/INTO 自定义目标变量名
  • AUTORECODE:字符串与数值统一编码 1..k 并自动加值标签;用户缺失值恒排最后、缺失码超过 3 个自动改用缺失范围(与 PSPP 一致)
  • SAMPLE:按比例抽样,或 SAMPLE n FROM N 精确抽 n 个,/SEED= 可复现
  • MRSETS 多重响应集:MDGROUP / MCGROUP 定义,/DISPLAY、/FREQUENCIES、/CROSSTABS、/DELETE;响应表同时给出应答数与应答个案数两个分母
  • COMBINE FILES:ADD FILES 纵向追加、MATCH FILES /BY 横向匹配(哈希连接,不要求输入已排序),/IN= 生成来源指示变量,/KEEP /DROP /RENAME 调整变量;字典按 PSPP merge_dictionaries 规则合并(先出现的文件胜出、字符串宽度取最大、类型冲突报错)
  • 这些命令既能在语法编辑器里执行,也有图形化入口(数据页菜单「合并数据集…」)

亮点 / Highlights — M5:口径复核、PSPP 对拍与性能基准

  • 缺失值口径收敛为五条规则并逐过程文档化(新增文档页「缺失值口径 / Missing values」):A 单变量过程只看该变量;B 多变量过程按个案对齐(相关矩阵成对删除,需要完整个案的过程整行删除);C 加权统计要求值与权重都有效;D 分组变量或分析变量缺失的个案不入任何组;E 分类过程把用户缺失值计为「缺失」而非一个类别
  • 顺带修掉一处多变量个案错位缺陷:此前部分过程先各自过滤列、再按位置截断,变量之间会错开一格
  • 与 PSPP 2.1.2 对拍:期望值取自 PSPP 源码树自带测试的期望输出(AUTORECODE、RANK、ONEWAY、CORRELATIONS 成对删除、NPAR TESTS Mann-Whitney),固化进 CI 每次运行
  • 性能基准:10 万行 × 5 列的核心分析路径逐步计时(本机总耗时 497 ms),CI 中作为 continue-on-error 的影子任务,只告警、不挡发布

口径修正 / Statistical conventions

  • Levene 方差齐性改为以组均值为中心(PSPP 与 SPSS 的 ONEWAY / T-TEST / GLM 口径);此前用的组中位数是 Brown-Forsythe,现由 useMean: false 提供
  • Mann-Whitney U 的渐近方差补上结校正 σ² = n1·n2·[(n+1)/12 − Σ(t³−t)/(12·n·(n−1))],p 用 2·Φ(z)(PSPP 的 Asymp. Sig.(双尾)),报告里的 Z 与 p 由此自洽;连续性校正后的 Z / p(SPSS、R correct = TRUE)另存于 extra['zContinuityCorrected'] / extra['pContinuityCorrected']
  • 二元 logistic 回归:IRLS 迭代此前在两点之间振荡、截距标准误取了标准化尺度;系数、OR、SE、p 现在来自真正的极大似然点

质量 / Quality

  • flutter analyze:无问题;packages/statkit 的 dart analyze 通过
  • flutter test --exclude-tags "golden || benchmark":213 项;flutter test --tags golden:17 项(Windows 生成基线);packages/statkit 的 dart test:91 项
  • 文档站点:npm ci + npm run docs:build 通过(26 个页面,新增中英「缺失值口径」与数据层命令说明)
  • dart pub publish --dry-run:0 warnings

构建环境 / Requirements

  • Flutter 3.41.9 stable(Dart SDK ^3.11.5)
  • statkit 0.5.0(本版一并发布到 pub.dev)

产物 / Artifacts

CI 会为本次发布构建并附加:Android APK、Windows x64(zip)、Linux x64(tar.gz)、macOS(zip)。


完整变更清单 / Full changelog:git log app-v1.3.1..app-v1.4.0

Stats-flutter v1.3.1 - UI/UX polish II

Choose a tag to compare

@Maicarons Maicarons released this 16 Oct 13:44

Stats-flutter v1.3.1 · UI/UX polish II / 表现层收尾

v1.3.0 把整套界面与交互重做了一遍,计划里还剩一批「延期到 v1.3.1」的条目;本版本把它们全部补完。
统计内核 packages/statkit 依旧未改动,计算口径与 v1.3.0 完全一致,可以直接替换旧版本。

亮点 / Highlights

  • 📊 图表补齐:真正的箱线图(须 / 四分位箱 / 中位数 / 均值菱形 / 离群点,多组并列);新增误差条图(分析目录 32 → 33 项,均值 ± 1.96×SE 须 + 总体均值参考线);Q-Q 图补 45° 参考线与理论/样本分位轴标题;碎石图补肘部虚线(曲率最大处)。
  • 🗂 图表配套:四种图表统一图例与空数据提示(点数不足、方差为零等情形都给出人话说明);tooltip 统一到同一套卡片样式;箱线图分组超过 6 组时折叠为前 6 组,并在图下与报告备注中写明「其余 N 组未显示」。
  • 🧊 数据表格冻结首列:宽屏(≥ 600)冻结「行号 + 首个变量列」,冻结区与滚动区纵向逐像素同步;窄屏只冻结行号列,变量列全部参与横向滚动。
  • ⌨️ 键盘可达:方向键选格、选中后 Enter / F2 进入编辑、Esc 取消、Tab 右移;分析中心 Ctrl/Cmd+K 聚焦搜索框;确认对话框首焦落在主行动按钮;快捷键提示直接写在数据表格工具栏上。
  • ✨ 动效与焦点:分析中心与工程列表的入场 stagger(24 ms 步长、总时长封顶 300 ms,自动尊重系统「减少动效」);自绘焦点环只在键盘操作时出现,触摸点击不闪环,且不额外占用 Tab 位。
  • 📤 分区单独导出:每个报告分区右上角可复制 Markdown、或单独导出 Markdown / HTML(文件名含报告名、分区标题与日期)。
  • 🔐 依赖安全:docs 站点的 5 条 Dependabot 公告全部升到修复版本(vite 5.4.21 → 6.4.4、esbuild 0.21.5 → 0.25.12、source-map-js 1.2.1 → 1.2.2)。

顺带修掉的缺陷 / Bug fixes

  • 数据表格单元格编辑的 Esc / Enter / Tab 在桌面端从未生效(v1.3.0 文档「双击编辑」一节已写明这三个键):按键处理器原先挂在 KeyboardListener 上,而它在 build 时会把自己包装后的回调传给 Focus,FocusNode.attach 执行 this.onKeyEvent = onKeyEvent ?? this.onKeyEvent 时把节点自带的处理器悄悄覆盖掉。改为把处理器挂到单元格 TextField 自己使用的 FocusNode 上,并补上方向键与 F2。
  • 分析参数选择器(变量下拉)在变量名较长时溢出。
  • 图表文字此前就地新建 TextStyle:CustomPaint 里的 TextPainter 不继承 DefaultTextStyle,会丢掉主题字体族(golden 下退化成实心方块);改为从主题 TextTheme 派生。
  • 误差条图的置信区间颜色与图例「95% 置信区间」不一致。
  • 分类轴出现半格刻度造成的重复标签(PC1 PC1 …);碎石图 x 轴与主成分点位对不齐。

质量 / Quality

  • flutter analyze:无警告
  • flutter test:124 项全部通过(widget / 单元 / 无障碍 / 响应式 / 导出 / 数据网格)
  • 视觉基线:15 张 golden(新增「分组箱线图 · 浅色」「箱线图 · 手机 · 深色」「数据表格 · 冻结首列 · 宽屏 · 浅色」),基线由 Windows 生成,CI 上以 --exclude-tags golden 排除,本地用 flutter test --tags golden 验证
  • 文档站点:npm ci + npm run docs:build 通过(24 个页面)

构建环境 / Requirements

  • Flutter 3.41.9 stable(Dart SDK ^3.11.5)
  • statkit 0.4.0(本地 path 依赖,未变更)

产物 / Artifacts

CI 会为本次发布构建并附加:Android APK、Windows x64(zip)、Linux x64(tar.gz)、macOS(zip)。


完整变更清单 / Full changelog:git log app-v1.3.0..app-v1.3.1

Stats-flutter v1.3.0 - UI/UX overhaul

Choose a tag to compare

@Maicarons Maicarons released this 15 Oct 12:32

Stats-flutter v1.3.0 · UI/UX overhaul / 界面与体验升级

冲「专业、克制的统计分析工作台」重做了一遍表现层与交互层。统计内核 packages/statkit 未改动,计算口径与 v1.2 完全一致;这是一个可以放心替换旧版本的界面升级。

亮点 / Highlights

  • 🎨 设计地基:新增 design_tokens.dart(间距 / 圆角 / 字号 / 动效 / 语义色),重写 app_theme.dart,明暗两套主题同等优先级。
  • 🔤 字体本地打包:内置 Inter(400/500/600/700,拉丁与数字),中文回退系统字体;移除 google_fonts,离线启动不再掉字体、不再有首屏 FOUT。数值统一启用等宽数字(tabular figures)。
  • 🧩 通用组件库:AppCard SectionHeader StatTile/StatChip EmptyState LoadingSkeleton AnalysisTile ParamVarPicker SignificanceBadge ChartCard + AdaptiveNavScaffold。
  • 🔍 分析中心:32 项分析 / 8 个分类可折叠分组,支持搜索、最近使用、收藏(本地持久化)。
  • 📊 报告与图表:自绘表格(等宽数字、数值右对齐、表头吸顶、斑马纹、横向滚动);p 值按阈值着色 + 星级 + 文字标注(色盲友好);分区可一键复制;HTML / Markdown 导出带新配色、深色模式与打印样式。
  • 📱 响应式:断点 600 / 840 / 1200,正文最大宽度 960 居中;手机底部导航 ↔ 宽屏侧栏(状态保持);375 / 768 / 1024 / 1440 四档无横向滚动。
  • ✨ 动效:FadeForwards 页面转场、骨架屏加载,全局响应系统「减少动态效果」设置。
  • 🌏 双语:ARB 各 576 条文案;学习课程与题库内容双语;版本号从 AppInfo 读取,与 pubspec.yaml 一致。
  • ♿ 可访问性:明暗两套正文对比度达 AA、交互元素满足 44×44 触摸目标、图标按钮带 tooltip 与语义标签、状态不只靠颜色区分。

顺带修掉的缺陷 / Bug fixes

  • 组件主题(按钮 / 标签 / Tab / 导航栏)此前使用裸 TextStyle,真机上会退回系统字体而不是 Inter。
  • 未选中的 chip 标签几乎不可见(覆盖了默认颜色,对比度仅 1.05)。
  • 收藏分析项时,新插入的收藏区块会把已展开的分类折叠回去(列表元素缺少稳定 key)。
  • 答题页底部按钮在 375px 宽度下溢出 15px。

质量 / Quality

  • flutter analyze:无告警
  • flutter test:72 项全部通过(widget / 单元 / 无障碍 / 响应式回归)
  • 视觉基线:8 张 golden(学习页明·暗·宽屏、测试页明·暗、课程详情明·暗、自适应导航),基线由 Windows 生成,CI 上以 --exclude-tags golden 排除,本地用 flutter test --tags golden 验证

构建环境 / Requirements

  • Flutter 3.41.9 stable(Dart SDK ^3.11.5)
  • statkit 0.4.0(本地 path 依赖,未变更)

产物 / Artifacts

CI 会为本次发布构建并附加:Android APK、Windows x64(zip)、Linux x64(tar.gz)、macOS(zip)。


完整变更清单 / Full changelog:git log app-v1.2.0..app-v1.3.0

app-v1.2.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 14:01
chore: remove tool/ from repo (local-only working scripts)

Stats-flutter v1.1.0 — SPSS interoperability

Choose a tag to compare

@Maicarons Maicarons released this 27 Sep 02:49

v1.1.0

SPSS .sav import

  • Read dictionary, value labels, compressed/uncompressed cases
  • Validated on 7 PSPP example files including real SPSS Windows output
  • Data menu: 导入 SPSS .sav

Reports

  • Export analysis reports as HTML (styled, shareable) and Markdown

Data quality

  • User missing values excluded from descriptives and analysis helpers

Syntax

  • Open / save .sps\ syntax files

Note

  • Excel .xlsx: export to CSV for now (CSV importer available)

Stats-flutter v1.0.0

Choose a tag to compare

@Maicarons Maicarons released this 26 Sep 17:03

Stats-flutter 1.0.0

移动优先的统计分析套件,灵感来自 GNU PSPP。

亮点

  • 工程化统计表管理(多工程、持久化)
  • 双击编辑数据表格、值标签、缺失值
  • 描述/t检验/ANOVA/相关/回归/卡方/非参数/信度/聚类/ROC/因子/逻辑回归
  • PSPP 风格数据变换与语法子集执行器
  • 学习 + 测试模块
  • 中英双语 i18n、主题色、开屏与统一 Logo
  • 可复用纯 Dart 统计内核 \packages/statkit\
  • Android 构建使用腾讯 Gradle / 阿里 Maven 镜像

安装

\\�ash
git clone https://github.com/Maicarons/stats-flutter.git
cd stats-flutter
flutter pub get
flutter run -d windows
\\