openpls-engine 0.7.0a2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openpls_engine-0.7.0a2.dist-info/METADATA +161 -0
- openpls_engine-0.7.0a2.dist-info/RECORD +24 -0
- openpls_engine-0.7.0a2.dist-info/WHEEL +5 -0
- openpls_engine-0.7.0a2.dist-info/licenses/LICENSE +674 -0
- openpls_engine-0.7.0a2.dist-info/top_level.txt +1 -0
- plspm/__init__.py +26 -0
- plspm/bootstrap.py +147 -0
- plspm/config.py +325 -0
- plspm/estimator.py +76 -0
- plspm/fit.py +112 -0
- plspm/htmt.py +119 -0
- plspm/inner_model.py +108 -0
- plspm/inner_summary.py +79 -0
- plspm/long_bootstrap.py +334 -0
- plspm/mga.py +222 -0
- plspm/mode.py +73 -0
- plspm/outer_model.py +43 -0
- plspm/plspm.py +246 -0
- plspm/q_squared.py +137 -0
- plspm/scale.py +108 -0
- plspm/scheme.py +68 -0
- plspm/unidimensionality.py +80 -0
- plspm/util.py +164 -0
- plspm/weights.py +193 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: openpls-engine
|
|
3
|
+
Version: 0.7.0a2
|
|
4
|
+
Summary: PLS-SEM compute engine, a maintained fork of plspm-python with extended metrics (SRMR, d_ULS, HTMT, Q², MGA) powering OpenPLS.
|
|
5
|
+
Home-page: https://github.com/googlecloudplatform/plspm-python
|
|
6
|
+
Author: Jez Humble
|
|
7
|
+
Author-email: Johannes Jacob <johannespjacob@gmail.com>
|
|
8
|
+
License: GPL-3.0-or-later
|
|
9
|
+
Project-URL: Homepage, https://github.com/jojacobsen/openpls-engine
|
|
10
|
+
Project-URL: Issues, https://github.com/jojacobsen/openpls-engine/issues
|
|
11
|
+
Project-URL: OpenPLS web app, https://openpls.app
|
|
12
|
+
Project-URL: Upstream (plspm-python), https://github.com/googlecloudplatform/plspm-python
|
|
13
|
+
Keywords: pls-sem,structural-equation-modeling,statistics,pls,sem
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
20
|
+
Classifier: Operating System :: OS Independent
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
22
|
+
Classifier: Intended Audience :: Science/Research
|
|
23
|
+
Requires-Python: >=3.10
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: pandas>=1.5
|
|
27
|
+
Requires-Dist: numpy>=1.23
|
|
28
|
+
Requires-Dist: scipy>=1.10
|
|
29
|
+
Requires-Dist: statsmodels>=0.14
|
|
30
|
+
Requires-Dist: scikit-learn>=1.2
|
|
31
|
+
Dynamic: author
|
|
32
|
+
Dynamic: home-page
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
|
|
35
|
+
# OpenPLS Engine
|
|
36
|
+
|
|
37
|
+
[](https://github.com/jojacobsen/openpls-engine/actions/workflows/ci.yml)
|
|
38
|
+
[](https://pypi.org/project/openpls-engine/)
|
|
39
|
+
[](https://pypi.org/project/openpls-engine/)
|
|
40
|
+
[](LICENSE)
|
|
41
|
+
|
|
42
|
+
The compute engine behind [OpenPLS](https://openpls.app), a Python 3 library
|
|
43
|
+
for Partial Least Squares Structural Equation Modeling (PLS-SEM).
|
|
44
|
+
|
|
45
|
+
`openpls-engine` is a fork of
|
|
46
|
+
[`plspm-python`](https://github.com/googlecloudplatform/plspm-python) by Jez
|
|
47
|
+
Humble (Google). It keeps the original algorithm intact and adds the metrics
|
|
48
|
+
and quality criteria that modern PLS-SEM reporting requires: HTMT, SRMR,
|
|
49
|
+
d_ULS, adjusted R², BIC, Stone-Geisser Q², Cronbach α, Dijkstra-Henseler ρ,
|
|
50
|
+
multi-group analysis, and a progress-streaming long bootstrap.
|
|
51
|
+
|
|
52
|
+
The engine also powers [OpenPLS](https://openpls.app) (the hosted web
|
|
53
|
+
application) and the CLI / Docker self-host distribution planned for the next
|
|
54
|
+
phase of the roadmap.
|
|
55
|
+
|
|
56
|
+
> **Status: pre-release (`0.7.0a1`).** All planned ports from the OpenPLS web
|
|
57
|
+
> app are in. Numerical alignment with reference implementations and PyPI
|
|
58
|
+
> publication are tracked in [TODO.md](TODO.md). See
|
|
59
|
+
> [CHANGELOG.md](CHANGELOG.md) for the version history.
|
|
60
|
+
|
|
61
|
+
## Why fork
|
|
62
|
+
|
|
63
|
+
* Upstream has not seen a release since 2020.
|
|
64
|
+
* OpenPLS adds substantial extensions: SRMR, d_ULS, HTMT, Q², adjusted R²,
|
|
65
|
+
BIC, multi-group analysis (MGA), permutation tests, mean replacement, and a
|
|
66
|
+
long-running bootstrap with BCa confidence intervals.
|
|
67
|
+
* The OpenPLS hosted product depends on a single source of truth for the
|
|
68
|
+
algorithm; a maintained, versioned package makes that practical.
|
|
69
|
+
* The intention is to release `openpls-engine` on PyPI once the API
|
|
70
|
+
stabilizes (see TODO).
|
|
71
|
+
|
|
72
|
+
## Installation
|
|
73
|
+
|
|
74
|
+
The package is not on PyPI yet. To use it from source:
|
|
75
|
+
|
|
76
|
+
```sh
|
|
77
|
+
git clone https://github.com/jojacobsen/openpls-engine.git
|
|
78
|
+
cd openpls-engine
|
|
79
|
+
python3 -m pip install -e .
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Once published, installation will be:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
pip install openpls-engine
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Development
|
|
89
|
+
|
|
90
|
+
```sh
|
|
91
|
+
python3 -m venv .venv
|
|
92
|
+
source .venv/bin/activate
|
|
93
|
+
pip install -r requirements-dev.txt
|
|
94
|
+
pip install -e .
|
|
95
|
+
|
|
96
|
+
pytest # run the test suite
|
|
97
|
+
ruff check . # lint
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
CI runs lint and tests on Python 3.10 through 3.13 against every push and
|
|
101
|
+
pull request against `main`.
|
|
102
|
+
|
|
103
|
+
## Versioning
|
|
104
|
+
|
|
105
|
+
`openpls-engine` follows [Semantic Versioning](https://semver.org). The
|
|
106
|
+
current pre-1.0 line is `0.x`. Tagged releases (`v0.7.0`, `v1.0.0`, ...)
|
|
107
|
+
trigger a GitHub Actions workflow that builds the package and publishes it
|
|
108
|
+
to PyPI via OIDC trusted publishing. The version is the single source of
|
|
109
|
+
truth in [`pyproject.toml`](pyproject.toml) and is exposed at runtime as
|
|
110
|
+
`plspm.__version__`.
|
|
111
|
+
|
|
112
|
+
See [CHANGELOG.md](CHANGELOG.md) for the per-version history.
|
|
113
|
+
|
|
114
|
+
## Usage
|
|
115
|
+
|
|
116
|
+
The public API mirrors upstream `plspm` 0.5.7. The
|
|
117
|
+
[upstream documentation](https://plspm.readthedocs.io/) is still authoritative
|
|
118
|
+
for the inherited interface; OpenPLS-specific docs will land alongside the
|
|
119
|
+
metric extensions.
|
|
120
|
+
|
|
121
|
+
```py
|
|
122
|
+
import pandas as pd
|
|
123
|
+
import plspm.config as c
|
|
124
|
+
from plspm.plspm import Plspm
|
|
125
|
+
from plspm.scheme import Scheme
|
|
126
|
+
from plspm.mode import Mode
|
|
127
|
+
|
|
128
|
+
satisfaction = pd.read_csv("tests/data/satisfaction.csv", index_col=0)
|
|
129
|
+
|
|
130
|
+
structure = c.Structure()
|
|
131
|
+
structure.add_path(["IMAG"], ["EXPE", "SAT", "LOY"])
|
|
132
|
+
structure.add_path(["EXPE"], ["QUAL", "VAL", "SAT"])
|
|
133
|
+
structure.add_path(["QUAL"], ["VAL", "SAT"])
|
|
134
|
+
structure.add_path(["VAL"], ["SAT"])
|
|
135
|
+
structure.add_path(["SAT"], ["LOY"])
|
|
136
|
+
|
|
137
|
+
config = c.Config(structure.path(), scaled=False)
|
|
138
|
+
for lv in ["IMAG", "EXPE", "QUAL", "VAL", "SAT", "LOY"]:
|
|
139
|
+
config.add_lv_with_columns_named(lv, Mode.A, satisfaction, lv.lower())
|
|
140
|
+
|
|
141
|
+
result = Plspm(satisfaction, config, Scheme.CENTROID)
|
|
142
|
+
print(result.inner_summary())
|
|
143
|
+
print(result.path_coefficients())
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## License
|
|
147
|
+
|
|
148
|
+
GNU General Public License v3.0, see [LICENSE](LICENSE). Inherited from
|
|
149
|
+
upstream `plspm-python` (also GPL-3.0).
|
|
150
|
+
|
|
151
|
+
## Attribution
|
|
152
|
+
|
|
153
|
+
This project is a fork of
|
|
154
|
+
[googlecloudplatform/plspm-python](https://github.com/googlecloudplatform/plspm-python)
|
|
155
|
+
by Jez Humble. The upstream R package
|
|
156
|
+
[plspm](https://github.com/gastonstat/plspm) by Gaston Sanchez and the
|
|
157
|
+
[seminr](https://github.com/sem-in-r/seminr) package by Soumya Ray and
|
|
158
|
+
Nicholas Danks remain the conceptual references for the algorithm. See
|
|
159
|
+
[ATTRIBUTION.md](ATTRIBUTION.md) for details.
|
|
160
|
+
|
|
161
|
+
OpenPLS is an independent project and not affiliated with Google.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
openpls_engine-0.7.0a2.dist-info/licenses/LICENSE,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
|
|
2
|
+
plspm/__init__.py,sha256=VUhao09juqYGQpSDQ8_UMn1pXgW2X319jKkIMPqZOTU,923
|
|
3
|
+
plspm/bootstrap.py,sha256=NtnCxAXPCGzLmnfr4BbQnQYymadD_4t41LvqmWT5sc8,7127
|
|
4
|
+
plspm/config.py,sha256=tVEJFULNmozRDSzT0U-UjYWG9Q7Zt4hPPwnuEIk8Nu4,16973
|
|
5
|
+
plspm/estimator.py,sha256=U2vFiIT1zEDnYXZfx5Ui2QHRwVoiXMoiUB049x8QeSQ,3098
|
|
6
|
+
plspm/fit.py,sha256=TDSu7D3v7YSCyjWQ1Ubaz87TyGAM8IrlIdx02XQIpIQ,4201
|
|
7
|
+
plspm/htmt.py,sha256=XQ3n4N0FC0lPj3VkTL4WkRVczlL9yx3TM2Mo22NPLE8,4545
|
|
8
|
+
plspm/inner_model.py,sha256=Xz7kzKtNyQg5ABQGL1EY1GSBwAIF-vk7nZMiPJ5_Kig,5136
|
|
9
|
+
plspm/inner_summary.py,sha256=Y6jMWhWKhL-NOBQQ4nOYGnqwcE3uJRZY_mabq2cTr_4,4027
|
|
10
|
+
plspm/long_bootstrap.py,sha256=88Xmeoi8o7xeGENTg06syDjt0SukmHxlAvsumRVN9pE,12876
|
|
11
|
+
plspm/mga.py,sha256=H3IJjx6lVQgfz1Eh_Zxwa9eEx7Z4FansBCQ9qv77mK4,8339
|
|
12
|
+
plspm/mode.py,sha256=xPVpYQRz8CYMgma4GS8YBpOdLmQGR9nezWE-k6nhrfk,3021
|
|
13
|
+
plspm/outer_model.py,sha256=fOv0vIHxAHSxyQJGqeGvnvsWbl7SsJTtt8UTGGrlIOY,2107
|
|
14
|
+
plspm/plspm.py,sha256=Eed5hkLvN59KdR4HT8Q1fGZ2_9b4ugwhnp-n1F6Wypo,11107
|
|
15
|
+
plspm/q_squared.py,sha256=zBhZP6VWCQzUBOh0bgXdkE1yoeIa4npR3Aw1qHHl0Dg,5793
|
|
16
|
+
plspm/scale.py,sha256=gvVZ0e27sLhgPJglDwqzt1_9_iMYeI9GLJ0xLbnZ0Lg,4046
|
|
17
|
+
plspm/scheme.py,sha256=UvmgXyG8NOlHKwaFhTKS-5C6c4yfwRqyVU87jd7JLtk,2174
|
|
18
|
+
plspm/unidimensionality.py,sha256=Ssn3wrce7RjykDy7Eg3S7f_hH1eHkzsz1l_4Jl4Ti9Y,4033
|
|
19
|
+
plspm/util.py,sha256=zWsFznTCOZjqEiDovzs7FAdSQdICLd0yCjqERTvipxE,5359
|
|
20
|
+
plspm/weights.py,sha256=L0IjntNhRQuzgHPhKN7Wamc0o6xA1t4TZ6lBTvolwaQ,9392
|
|
21
|
+
openpls_engine-0.7.0a2.dist-info/METADATA,sha256=cZHnGLNwu7f8HZmO0EjCdJQoOerpZScdUd0YnrEy3cI,6132
|
|
22
|
+
openpls_engine-0.7.0a2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
23
|
+
openpls_engine-0.7.0a2.dist-info/top_level.txt,sha256=guUiqVpR9brhIEhtL9j9GCHzK6wFwN7OIn2m5QGXl_0,6
|
|
24
|
+
openpls_engine-0.7.0a2.dist-info/RECORD,,
|