y0
(pronuncia-se "por que não?") é um código Python para inferência causal.
y0
possui uma linguagem específica de domínio interno completa para representar expressões de probabilidade:
from y0 . dsl import P , A , B
# The probability of A given B
expr_1 = P ( A | B )
# The probability of A given not B
expr_2 = P ( A | ~ B )
# The joint probability of A and B
expr_3 = P ( A , B )
Também pode ser usado para manipular expressões:
from y0 . dsl import P , A , B , Sum
P ( A , B ). marginalize ( A ) == Sum [ A ]( P ( A , B ))
P ( A , B ). conditional ( A ) == P ( A , B ) / Sum [ A ]( P ( A , B ))
Objetos DSL podem ser convertidos em strings com str()
e analisados novamente usando y0.parser.parse_y0()
.
Uma demonstração completa do DSL pode ser encontrada neste Jupyter Notebook
y0
tem uma noção de gráficos mistos direcionados acíclicos construídos sobre networkx
que podem ser usados para modelar causalidade:
from y0 . graph import NxMixedGraph
from y0 . dsl import X , Y , Z1 , Z2
# Example from:
# J. Pearl and D. Mackenzie (2018)
# The Book of Why: The New Science of Cause and Effect.
# Basic Books, p. 240.
napkin = NxMixedGraph . from_edges (
directed = [
( Z2 , Z1 ),
( Z1 , X ),
( X , Y ),
],
undirected = [
( Z2 , X ),
( Z2 , Y ),
],
)
y0
tem muitos exemplos pré-escritos em y0.examples
de Pearl, Shpitser, Bareinboim e outros.
y0
fornece implementações reais de muitos algoritmos que permaneceram não implementados nos últimos 15 anos de publicações, incluindo:
Algoritmo | Referência |
---|---|
EU IA | Shpitser e Pérola, 2006 |
CDI | Shpitser e Pérola, 2008 |
EU IA* | Shpitser e Pérola, 2012 |
CDI* | Shpitser e Pérola, 2012 |
Resultados substitutos | Tikka e Karvanen, 2018 |
Aplique um algoritmo a um ADMG e uma consulta causal para gerar uma estimativa representada na DSL como:
from y0 . dsl import P , X , Y
from y0 . examples import napkin
from y0 . algorithm . identify import Identification , identify
# TODO after ID* and IDC* are done, we'll update this interface
query = Identification . from_expression ( graph = napkin , query = P ( Y @ X ))
estimand = identify ( query )
assert estimand == P ( Y @ X )
A versão mais recente pode ser instalada a partir do PyPI com:
$ pip install y0
O código e os dados mais recentes podem ser instalados diretamente do GitHub com:
$ pip install git+https://github.com/y0-causal-inference/y0.git
Contribuições, seja registrando um problema, fazendo uma solicitação pull ou bifurcando, são bem-vindas. Consulte CONTRIBUTING.md para obter mais informações sobre como se envolver.
O código neste pacote está licenciado sob a licença BSD-3-Clause.
Antes de publicarmos uma nota de aplicação em y0
, você pode citar este software por meio de nosso registro Zenodo (veja também o emblema acima):
@software { y0 ,
author = { Charles Tapley Hoyt and
Jeremy Zucker and
Marc-Antoine Parent } ,
title = { y0-causal-inference/y0 } ,
month = jun,
year = 2021 ,
publisher = { Zenodo } ,
version = { v0.1.0 } ,
doi = { 10.5281/zenodo.4950768 } ,
url = { https://doi.org/10.5281/zenodo.4950768 }
}
Este projeto foi apoiado por diversas organizações (em ordem alfabética):
O desenvolvimento do Motor de Inferência Causal Y0 foi financiado pelas seguintes doações:
Órgão Financiador | Programa | Conceder |
---|---|---|
DARPA | Automatizando a Extração de Conhecimento Científico (ASKE) | HR00111990009 |
Iniciativa de Convergência do Modelo de Dados PNNL | Métodos de inferência causal e aprendizado de máquina para análise de comprometimento de unidade restrita de segurança (SCY0) | 90001 |
DARPA | Automatizando a Extração e Modelagem de Conhecimento Científico (ASKEM) | HR00112220036 |
Este pacote foi criado com o pacote cookiecutter de @audreyfeldroy usando o modelo cookiecutter-snekpack de @cthoyt.
A seção final do README é para quem deseja se envolver fazendo uma contribuição de código.
Para instalar em modo de desenvolvimento, use o seguinte:
git clone git+https://github.com/y0-causal-inference/y0.git
cd y0
pip install -e .
Este projeto usa cruft
para manter o padrão (ou seja, configuração, diretrizes de contribuição, configuração de documentação) atualizado com o pacote cookiecutter upstream. Atualize com o seguinte:
pip install cruft
cruft update
Mais informações sobre o comando de atualização do Cruft estão disponíveis aqui.
Depois de clonar o repositório e instalar tox
com pip install tox tox-uv
, os testes de unidade na pasta tests/
podem ser executados de forma reproduzível com:
tox -e py
Além disso, esses testes são executados novamente automaticamente com cada commit em uma ação GitHub.
A documentação pode ser construída localmente usando o seguinte:
git clone git+https://github.com/y0-causal-inference/y0.git
cd y0
tox -e docs
open docs/build/html/index.html
A documentação instala automaticamente o pacote, bem como os docs
extras especificados em pyproject.toml
. plugins sphinx
como texext
podem ser adicionados lá. Além disso, elas precisam ser adicionadas à lista extensions
em docs/source/conf.py
.
A documentação pode ser implantada no ReadTheDocs usando este guia. O arquivo YAML .readthedocs.yml
contém toda a configuração necessária. Você também pode configurar a integração contínua no GitHub para verificar não apenas se o Sphinx pode construir a documentação em um ambiente isolado (ou seja, com tox -e docs-test
), mas também se o ReadTheDocs também pode construí-la.
Zenodo é um sistema de arquivamento de longo prazo que atribui um DOI a cada versão do seu pacote.
Após essas etapas, você está pronto para começar! Depois de fazer o "lançamento" no GitHub (as etapas para isso estão abaixo), você pode navegar até https://zenodo.org/account/settings/github/repository/y0-causal-inference/y0 para ver o DOI do lançamento e link para o registro Zenodo para ele.
Você só precisa executar as etapas a seguir uma vez.
Você deve executar as etapas a seguir uma vez por máquina. Crie um arquivo em seu diretório inicial chamado .pypirc
e inclua o seguinte:
[distutils]
index-servers =
pypi
testpypi
[pypi]
username = __token__
password = <the API token you just got>
# This block is optional in case you want to be able to make test releases to the Test PyPI server
[testpypi]
repository = https://test.pypi.org/legacy/
username = __token__
password = <an API token from test PyPI>
Observe que, como o PyPI exige autenticação baseada em token, usamos __token__
como usuário, literalmente. Se você já possui um arquivo .pypirc
com uma seção [distutils]
, apenas certifique-se de que haja uma chave index-servers
e que o pypi
esteja em sua lista associada. Mais informações sobre como configurar o arquivo .pypirc
podem ser encontradas aqui.
Depois de instalar o pacote no modo de desenvolvimento e instalar tox
com pip install tox tox-uv
, execute o seguinte no shell:
tox -e finish
Este script faz o seguinte:
pyproject.toml
, CITATION.cff
, src/y0/version.py
e docs/source/conf.py
para não ter o sufixo -dev
build
twine
.tox -e bumpversion -- minor
depois. Isso fará com que Zenodo atribua um DOI ao seu lançamento também.