From 4001cb73ddea1fe6b524b5ca4afc81ef8fe7e9d4 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:04:26 +0200 Subject: [PATCH 01/25] Delete .gitignore --- .gitignore | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index fae8299..0000000 --- a/.gitignore +++ /dev/null @@ -1,39 +0,0 @@ -# History files -.Rhistory -.Rapp.history - -# Session Data files -.RData - -# User-specific files -.Ruserdata - -# Example code in package build process -*-Ex.R - -# Output files from R CMD build -/*.tar.gz - -# Output files from R CMD check -/*.Rcheck/ - -# RStudio files -.Rproj.user/ - -# produced vignettes -vignettes/*.html -vignettes/*.pdf - -# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 -.httr-oauth - -# knitr and R markdown default cache directories -*_cache/ -/cache/ - -# Temporary files created by R markdown -*.utf8.md -*.knit.md - -# R Environment Variables -.Renviron From a6f71c4298bd3cc97c1aa234efd59d43a282fedb Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:04:56 +0200 Subject: [PATCH 02/25] Delete LICENSE --- LICENSE | 674 -------------------------------------------------------- 1 file changed, 674 deletions(-) delete mode 100644 LICENSE diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f288702..0000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. From 457bb994ce7e5978d650b29484c1756be670d275 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:05:14 +0200 Subject: [PATCH 03/25] =?UTF-8?q?Delete=20Mod=C3=A9lisation.R?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "Mod\303\251lisation.R" | 676 ---------------------------------------- 1 file changed, 676 deletions(-) delete mode 100644 "Mod\303\251lisation.R" diff --git "a/Mod\303\251lisation.R" "b/Mod\303\251lisation.R" deleted file mode 100644 index 16882f4..0000000 --- "a/Mod\303\251lisation.R" +++ /dev/null @@ -1,676 +0,0 @@ -### Modélisation ! -library(magrittr) # paquetage nécessaire pour utiliser le tuyau ou pipe de programmation -library(gapminder) -library(tidyverse) -library(SmartEDA) -library(corrplot) -library(RColorBrewer) -library(ggthemes) -library(ggpubr) -library(knitr) -library(rmarkdown) -library(markdown) -### définition du répertoire de travail ---- -setwd("c:/Cours_R") ### changez cela dans votre environnement -getwd() # afficher le répertoire de travail. -theme_set(theme_bw()) # -(.packages()) - -### modéle sur les données gapmind 2007 2019 ------ -# lancement de paquetages -library(estimatr) # procédures d'estimation optimisées -library(AER) # paquetage d'économétrie complet -library(olsrr) # suite complète d'estimations et tes avec ols -# https://olsrr.rsquaredacademy.com/index.html -library(mctest) # paquetage complet de diagnostics de colinéarité -(.packages()) - -### un premier modéle ols... -mco1 <- lm(log(GDI_2019) ~ log(GNI_2019/pop_2019), data = gapmind_2007_19) -mco1 -smco1 <- summary(mco1) -smco1 -#### observons l'objet modéle: -class(mco1) -mode(mco1) -str(mco1) -View(mco1) -plot(mco1) -### explication des graphiques de diagnostic de regression: -# http://www.sthda.com/english/articles/39-regression-model-diagnostics/161-linear-regression-assumptions-and-diagnostics-in-r-essentials/ - -install.packages("devtools") -devtools::install_github("cardiomoon/ggiraphExtra") - -### afficher les noms d'une liste ou d'un objet: -names(mco1) -names(gapmind_2007_19) -names(smco1) -View(smco1) - -### éa marche pour presque tout: -names(gapmind_2007) -names(gdignilog) - -### on va tenter de prédire GDI_2019 avec gdpPercap 2007 qui n'a pas de NA ! -summary(gapmind_2007_19$GDI_2019) -summary(gapmind_2007_19$gdpPercap) -### modèle 2: ajustement de GDI_2019 par gdppc 2007 (sans NA) -mco2 <- (log(GDI_2019) ~ log(gdpPercap), - data = filter(gapmind_2007_19, !is.na(gapmind_2007_19$GDI_2019))) -smco2 <- summary(mco2) -smco2 -smco1 -plot(mco2) -### utilisons les valeurs de gdpPercap pour prédire les NAs de GDI_2019 -gdipred2 <- filter(gapmind_2007_19$GDI_2019, is.na(gapmind_2007_19$GDI_2019)) -## ou bien ce que nous avions calculé: -gdipred2 <- gapmind_07_19_na -names(gdipred2) -glimpse(gdipred2) -yhat.mco2 <- predict(mco2, gdipred2) -yhat.mco2 -### en fait on peut tout faire en ggplot ! -# https://ggplot2.tidyverse.org/reference/fortify..html -head(fortify(mco2), 25) ### on va utiliser fortify mais broom devrait étre bien mieux ! -### rappeler les graphiques de diagnostic -plot(mco2, which = 1:6) - -##### modèle MCO 4 -mco4 <- lm(log(GDI_2019) ~ log(gdpPercap), - weights = pop, - data = filter(gapmind_2007_19, !is.na(gapmind_2007_19$GDI_2019))) -smco4 <- summary(mco4) -smco4 -plot(mco4, which = 1:6) - -### on peut regarder le modéle avec les ggplots via fortify: -ggplot(mco2, aes(.fitted, .resid)) + - geom_point() + - geom_hline(yintercept = 0) + - geom_smooth(se = FALSE) - -ggplot(mco2, aes(.fitted, .stdresid)) + - geom_point() + - geom_hline(yintercept = c(-2,0,2), colour = "red") + - geom_smooth(se = FALSE) - -ggplot(mco4, aes(.fitted, .resid)) + - geom_point() + - geom_hline(yintercept = 0) + - geom_smooth(se = FALSE) - -ggplot(mco4, aes(.fitted, .stdresid)) + - geom_point() + - geom_hline(yintercept = c(-2,0,2)) + - geom_smooth(se = FALSE) - -#### en fait on avait un tibble filtré sans na sur gdi_2019: -mco3 <- lm(log(GDI_2019) ~ log(gdpPercap), data = gapmind_07_19_gdi) -smco3 <- summary(mco3) -smco3 -plot(mco3) ### c'est le méme modéle mais les données sont compatibles ! -ggplot(mco3, aes(.fitted, .resid)) + - geom_point() + - geom_hline(yintercept = 0) + - geom_smooth(se = FALSE) - -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(.fitted, .stdresid)) + - geom_point(aes(color = HDI_Class, shape = continent)) + - geom_hline(yintercept = 0) + - geom_smooth(se = FALSE) + - scale_color_brewer(palette = "Dark2") + - labs(title = "Graphique ajustement vs. résidus", - subtitle = "Résidus studentisés", - x = "Valeurs ajustées", y = "Résidus studentisés", - caption = "Modèle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + - scale_color_discrete(name = "Classe d'HDI", labels = c("Haute", "Basse", "Moyenne", "Très haute")) + - scale_shape_discrete(name = "Continent", labels = c("Afrique", "Amérique", "Asie", "Europe", "Océanie")) - -### graphe quantile quantile des résidus -ggplot(mco3) + - stat_qq(aes(sample = .stdresid)) + - geom_abline(color = "red") + - geom_vline(xintercept = c(-2, 2), color = "blue") + - geom_hline(yintercept = 0) - -### mais on peut aussi le calculer selon les facteurs actifs: -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(color = HDI_Class, shape = continent)) + - stat_qq(aes(sample = .stdresid)) + - geom_abline(color = "red") + - geom_vline(xintercept = c(-2, 2), color = "blue") + - labs(title = "Graphique quantiles-quantiles des résidus", - subtitle = "Résidus studentisés", - x = "Quantile théoriques", y = "Quantiles empiriques", - caption = "Modèle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + - scale_color_discrete(name = "Classe d'HDI", - labels = c("Haute", "Basse", "Moyenne", "Très haute")) + - scale_shape_discrete(name = "Continent", - labels = c("Afrique", "Amérique", "Asie", "Europe", "Océanie")) - - -### on peut appliquer notre esthétique sur les données du qq plot: -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(color = HDI_Class)) + - stat_qq(aes(sample = .stdresid)) + - stat_qq_line(aes(sample = .stdresid)) + - geom_abline(color = "red") + - geom_vline(xintercept = c(-2, 2), color = "blue") + - labs(title = "Graphique quantiles-quantiles des résidus selon l'HDI", - subtitle = "Résidus studentisés", - x = "Quantile théoriques", y = "Quantiles empiriques", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + - scale_color_discrete(name = "Classe d'HDI", - labels = c("Haute", "Basse", "Moyenne", "Très haute")) - -### mais on peut aussi le calculer selon les facteurs actifs: -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(color = continent)) + - stat_qq(aes(sample = .stdresid)) + - stat_qq_line(aes(sample = .stdresid)) + - geom_abline(color = "red", linetype = 3) + # attention, l'esthétique doit s'appliquer é *._line - geom_vline(xintercept = c(-2, 2), color = "blue", linetype = 2) + - labs(title = "Graphique quantiles-quantiles des résidus selon le continent", - subtitle = "Résidus studentisés", - x = "Quantile théoriques", y = "Quantiles empiriques", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Continent") + - scale_color_discrete(name = "Continent", labels = c("Afrique", "Amérique", "Asie", "Europe", "Océanie")) - -### on peut regarder les résidus absolus: ---- -plot(mco3, which = 3) -# same ggplot: -ggplot(mco3, aes(.fitted, sqrt(abs(.stdresid)))) + - geom_point() + - geom_smooth(se = FALSE) -### soit: -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(.fitted, sqrt(abs(.stdresid)))) + - geom_point(aes(color = HDI_Class)) + - geom_hline(color = "blue", linetype = 3, yintercept = 2.0) + - geom_smooth(se = FALSE) + - labs(title = "Graphique échelle-localisation", - subtitle = "Racine carrée des résidus standardisés", - x = "Valeurs ajustées", y = "Racine carrée des résidus standardisés", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + - scale_color_discrete(name = "Classe d'HDI", labels = c("Haute", "Basse", "Moyenne", "Très haute")) - - -### distances de Cook ---- -plot(mco3, which = 4) -### en ggplot frustre: -ggplot(mco3, aes(seq_along(.cooksd), .cooksd)) + - geom_col() -smco3 - -### effet intéressant quand on applique l'esthétiue par collage de la commande: -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(seq_along(.cooksd), .cooksd)) + - geom_col(aes(color = HDI_Class)) # collage de color ! -# rectification par fill. -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(seq_along(.cooksd), .cooksd)) + - geom_col(aes(fill = HDI_Class)) + # collage de color ! - geom_hline(color = "blue", linetype = 2, yintercept = 0.1) + -labs(title = "Graphique des distances de Cook", - subtitle = "Indicateur d'influence des observations", - x = "Index", y = "Distances de Cook", - caption = "Modèle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + # pourrait ajouter la palette Rcolorbrewer - scale_fill_discrete(name = "Classe d'HDI", labels = c("Haute", "Basse", "Moyenne", "Très haute")) - - -### Graphiques Résidus vs levier ---- -plot(mco3, which = 5) -### ggplot simple: -ggplot(mco3, aes(.hat, .stdresid)) + - geom_vline(size = 2, colour = "white", xintercept = 0) + - geom_hline(size = 2, colour = "white", yintercept = 0) + - geom_point() + geom_smooth(se = FALSE) -### ggplot amélioré: -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(.hat, .stdresid)) + - geom_vline(size = 0.5, colour = "red", xintercept = 0) + - geom_hline(size = 0.5, colour = "red", yintercept = 0) + - geom_point(aes(color = HDI_Class)) + - geom_smooth(se = FALSE) + - labs(title = "Graphique des résidus vs leviers", - subtitle = "Indicateur d'influence des observations sur les résidus", - x = "Leviers", y = "Distances de Cook", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + # pourrait ajouter la palette Rcolorbrewer - scale_color_discrete(name = "Classe d'HDI", - labels = c("Haute", "Basse", "Moyenne", "Très haute")) - -### on peut jouer sur la taille avec size dans geom point ! -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(.hat, .stdresid)) + - geom_vline(size = 0.5, xintercept = 0) + - geom_hline(size = 0.5, yintercept = 0) + - geom_point(aes(color = HDI_Class, size = .cooksd)) + - geom_smooth(se = FALSE, size = 0.5) + - labs(title = "Graphique des résidus vs leviers", - subtitle = "Indicateur d'influence des observations sur les résidus", - x = "Leviers", y = "Résidus standardisés", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + # pourrait ajouter la palette Rcolorbrewer - scale_color_discrete(name = "Classe d'HDI", - labels = c("Haute", "Basse", "Moyenne", "Très haute")) - -### graphique Cook -- Leviers -plot(mco3, which = 6) # le sixiéme graphique de diagnostic ! -### ggplot basic -ggplot(mco3, aes(.hat, .cooksd)) + - geom_vline(xintercept = 0, colour = NA) + - geom_abline(slope = seq(0, 3, by = 0.5), colour = "white") + - geom_smooth(se = FALSE) + - geom_point() -### ggplot amélioré -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(.hat, .cooksd)) + - geom_vline(xintercept = 0, colour = NA) + - geom_abline(slope = seq(0, 3, by = 0.5), colour = "red", linetype = 2) + # esthétiques de geom_line() - geom_smooth(se = FALSE) + - geom_point(aes(color = HDI_Class)) + - labs(title = "Graphique des leviers vs distances de Cook", - subtitle = "Levier = hii / (1 - hii)", - x = "Leviers", y = "Distances de Cook", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") - -### on peut aussi modifier l'esthétique en faisant le ratio cook/hat: -ggplot(mco3, aes(.hat, .cooksd)) + - geom_point(aes(size = .cooksd / .hat)) + - scale_size_area() -# amélioré: -ggplot(fortify(mco3, gapmind_07_19_gdi), aes(.hat, .cooksd)) + - geom_vline(xintercept = 0, colour = NA) + - geom_abline(slope = seq(0, 3, by = 0.5), colour = "red", linetype = 2) + # esthétiques de geom_line() - geom_smooth(se = FALSE) + - geom_point(aes(color = HDI_Class, size = .cooksd / .hat)) + - scale_size_area() + - labs(title = "Graphique des leviers vs distances de Cook", - subtitle = "Levier = hii / (1 - hii)", - x = "Leviers", y = "Distances de Cook", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") - -### on voit donc la richesse des graphiques de diagnostic de régression ! - -#### regardons avec broom les mises en formes de modéles... ---- -install.packages("broom") -install.packages("broomhelpers") -install.packages("tidymodels") -install.packages("finalfit") -library(broom) -library(broom.helpers) -library(tidymodels) -library(finalfit) -### https://broom.tidymodels.org/ -### https://www.tidymodels.org/ -### https://finalfit.org/reference/finalfit.html - -### la base: le modéle 3: -mco3 # le plus compact: l'objet associé au modéle... -summary(mco3) # un peu plus complet... mais... -# regardons le bazar: -str(mco3) - -mco3$coefficients -mco3$residuals -mco3$fitted.values -names(mco3) - -### avec broom on transforme les modéles bazars en beaux tibbles ! -t.mco3 <- tidy(mco3) # ah c'est plus beau ! -glimpse(t.mco3) -# noter la colonne terme accessible avec $ ! -aug.mco3 <- augment(mco3) # on a un équivalent élargi du modéle -View(aug.mco3) -g.mco3 <- glance(mco3) # coup d'oeil aux diagnostics de régression ! -### accéder aux objets modéle ---- -names(mco3) -modele_3 <- c(t.mco3, aug.mco3, g.mco3) -modele_3 -str(modele_3) - -#### modele mco 4 ----- -plot(mco4) ### c'est le méme modéle mais les données sont compatibles ! -ggplot(mco4, aes(.fitted, .resid)) + - geom_point() + - geom_hline(yintercept = 0) + - geom_smooth(se = FALSE) - -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(.fitted, .stdresid)) + - geom_point(aes(color = HDI_Class, shape = continent)) + - geom_hline(yintercept = 0) + - geom_hline(yintercept = c(-2.5, 2.5), linetype = 2, color = "red") + - geom_smooth(se = FALSE) + - scale_color_brewer(palette = "Dark2") + - labs(title = "Graphique ajustement vs. résidus", - subtitle = "Résidus studentisés", - x = "Valeurs ajustées", y = "Résidus studentisés", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + - scale_color_discrete(name = "Classe d'HDI", labels = c("Haute", "Basse", "Moyenne", "Trés haute")) + - scale_shape_discrete(name = "Continent", labels = c("Afrique", "Amérique", "Asie", "Europe", "Océanie")) - -### graphe quantile quantile des résidus -ggplot(mco4) + - stat_qq(aes(sample = .stdresid)) + - geom_abline(color = "red") + - geom_vline(xintercept = c(-2, 2), color = "blue") + - geom_hline(yintercept = 0) - -### mais on peut aussi le calculer selon les facteurs actifs: -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(color = HDI_Class, shape = continent)) + - stat_qq(aes(sample = .stdresid)) + - geom_abline(color = "red") + - geom_vline(xintercept = c(-2, 2), color = "blue") + - geom_hline(yintercept = c(-2.5, 2.5), linetype = 2, color = "blue") + - labs(title = "Graphique quantiles-quantiles des résidus", - subtitle = "Résidus studentisés", - x = "Quantile théoriques", y = "Quantiles empiriques", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + - scale_color_discrete(name = "Classe d'HDI", - labels = c("Haute", "Basse", "Moyenne", "Trés haute")) + - scale_shape_discrete(name = "Continent", - labels = c("Afrique", "Amérique", "Asie", "Europe", "Océanie")) - - -### on peut appliquer notre esthétique sur les données du qq plot: -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(color = HDI_Class)) + - stat_qq(aes(sample = .stdresid)) + - stat_qq_line(aes(sample = .stdresid)) + - geom_abline(color = "red") + - geom_vline(xintercept = c(-2, 2), color = "blue") + - labs(title = "Graphique quantiles-quantiles des résidus selon l'HDI", - subtitle = "Résidus studentisés", - x = "Quantile théoriques", y = "Quantiles empiriques", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + - scale_color_discrete(name = "Classe d'HDI", - labels = c("Haute", "Basse", "Moyenne", "Trés haute")) - -### mais on peut aussi le calculer selon les facteurs actifs: -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(color = continent)) + - stat_qq(aes(sample = .stdresid)) + - stat_qq_line(aes(sample = .stdresid)) + - geom_abline(color = "red", linetype = 3) + # attention, l'esthétique doit s'appliquer é *._line - geom_vline(xintercept = c(-2, 2), color = "blue", linetype = 2) + - geom_hline(yintercept = c(-2.5, 2.5), linetype = 2, color = "blue") + - labs(title = "Graphique quantiles-quantiles des résidus selon le continent", - subtitle = "Résidus studentisés", - x = "Quantile théoriques", y = "Quantiles empiriques", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Continent") + - scale_color_discrete(name = "Continent", labels = c("Afrique", "Amérique", "Asie", "Europe", "Océanie")) - -### on peut regarder les résidus absolus: ---- -plot(mco4, which = 3) -# same ggplot: -ggplot(mco4, aes(.fitted, sqrt(abs(.stdresid)))) + - geom_point() + - geom_smooth(se = FALSE) -### soit: -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(.fitted, sqrt(abs(.stdresid)))) + - geom_point(aes(color = HDI_Class)) + - geom_hline(color = "blue", linetype = 3, yintercept = 2.0) + - geom_smooth(se = FALSE) + - labs(title = "Graphique échelle-localisation", - subtitle = "Racine carrée des résidus standardisés", - x = "Valeurs ajustées", y = "Racine carrée des résidus standardisés", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + - scale_color_discrete(name = "Classe d'HDI", labels = c("Haute", "Basse", "Moyenne", "Trés haute")) - - -### distances de Cook ---- -plot(mco4, which = 4) -### en ggplot frustre: -ggplot(mco4, aes(seq_along(.cooksd), .cooksd)) + - geom_col() -### effet intéressant quand on applique l'esthétiue par collage de la commande: -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(seq_along(.cooksd), .cooksd)) + - geom_col(aes(color = HDI_Class)) # collage de color ! -# rectification par fill. -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(seq_along(.cooksd), .cooksd)) + - geom_col(aes(fill = HDI_Class)) + # collage de color ! - geom_hline(color = "blue", linetype = 2, yintercept = 0.1) + - labs(title = "Graphique des distances de Cook", - subtitle = "Indicateur d'influence des observations", - x = "Index", y = "Distances de Cook", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + # pourrait ajouter la palette Rcolorbrewer - scale_fill_discrete(name = "Continent", labels = c("Afrique", "Amérique", "Asie", "Europe", "Océanie")) - -# rectification par fill. -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(seq_along(.cooksd), .cooksd)) + - geom_col(aes(fill = continent)) + # collage de color ! - geom_hline(color = "blue", linetype = 2, yintercept = 0.1) + - labs(title = "Graphique des distances de Cook", - subtitle = "Indicateur d'influence des observations", - x = "Index", y = "Distances de Cook", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + # pourrait ajouter la palette Rcolorbrewer - scale_fill_discrete(name = "Classe d'HDI", labels = c("Haute", "Basse", "Moyenne", "Trés haute")) - - - -### Graphiques Résidus vs levier ---- -plot(mco4, which = 5) -### ggplot simple: -ggplot(mco4, aes(.hat, .stdresid)) + - geom_vline(size = 2, colour = "white", xintercept = 0) + - geom_hline(size = 2, colour = "white", yintercept = 0) + - geom_point() + geom_smooth(se = FALSE) -### ggplot amélioré: -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(.hat, .stdresid)) + - geom_vline(size = 0.5, colour = "red", xintercept = 0) + - geom_hline(size = 0.5, colour = "red", yintercept = 0) + - geom_hline(size = 0.5, colour = "blue", yintercept = c(-2.5, 2.5), linetype = 2) + - geom_point(aes(color = HDI_Class)) + - geom_smooth(se = FALSE) + - labs(title = "Graphique des résidus vs leviers", - subtitle = "Indicateur d'influence des observations sur les résidus", - x = "Leviers", y = "Distances de Cook", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + # pourrait ajouter la palette Rcolorbrewer - scale_color_discrete(name = "Classe d'HDI", - labels = c("Haute", "Basse", "Moyenne", "Trés haute")) -### on peut jouer sur la taille avec size dans geom point ! -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(.hat, .stdresid)) + - geom_vline(size = 0.5, xintercept = 0) + - geom_hline(size = 0.5, yintercept = 0) + - geom_hline(size = 0.5, colour = "blue", yintercept = c(-2.5, 2.5), linetype = 2) + - geom_point(aes(color = HDI_Class, size = .cooksd)) + - geom_smooth(se = FALSE, size = 0.5) + - labs(title = "Graphique des résidus vs leviers", - subtitle = "Indicateur d'influence des observations sur les résidus", - x = "Leviers", y = "Résidus standardisés", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + # pourrait ajouter la palette Rcolorbrewer - scale_color_discrete(name = "Classe d'HDI", - labels = c("Haute", "Basse", "Moyenne", "Trés haute")) - -### graphique Cook -- Leviers -plot(mco4, which = 6) # le sixiéme graphique de diagnostic ! -### ggplot basic -ggplot(mco4, aes(.hat, .cooksd)) + - geom_vline(xintercept = 0, colour = NA) + - geom_abline(slope = seq(0, 3, by = 0.5), colour = "white") + - geom_smooth(se = FALSE) + - geom_point() -### ggplot amélioré -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(.hat, .cooksd)) + - geom_vline(xintercept = 0, colour = NA) + - geom_abline(slope = seq(0, 3, by = 0.5), colour = "red", linetype = 2) + # esthétiques de geom_line() - geom_smooth(se = FALSE) + - geom_point(aes(color = HDI_Class)) + - labs(title = "Graphique des leviers vs distances de Cook", - subtitle = "Levier = hii / (1 - hii)", - x = "Leviers", y = "Distances de Cook", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + - scale_color_discrete(name = "Classe d'HDI", - labels = c("Haute", "Basse", "Moyenne", "Trés haute")) - -### on peut aussi modifier l'esthétique en faisant le ratio cook/hat: -ggplot(mco4, aes(.hat, .cooksd)) + - geom_point(aes(size = .cooksd / .hat)) + - scale_size_area() -# amélioré: -ggplot(fortify(mco4, gapmind_07_19_gdi), aes(.hat, .cooksd)) + - geom_vline(xintercept = 0, colour = NA) + - geom_abline(slope = seq(0, 3, by = 0.5), colour = "red", linetype = 2) + # esthétiques de geom_line() - geom_smooth(se = FALSE) + - geom_point(aes(color = HDI_Class, size = .cooksd / .hat)) + - scale_size_area() + - labs(title = "Graphique des leviers vs distances de Cook", - subtitle = "Levier = hii / (1 - hii)", - x = "Leviers", y = "Distances de Cook", - caption = "Modéle 3, lnGDI_2019 ~ lngdpPercap_2007", - color = "Classe d'HDI") + - scale_color_discrete(name = "Classe d'HDI", - labels = c("Haute", "Basse", "Moyenne", "Trés haute")) -smco4 - -### on voit donc la richesse des graphiques de diagnostic de régression ! - -#### regardons avec broom les mises en formes de modéles... ---- -install.packages("broom") -install.packages("broomhelpers") -install.packages("tidymodels") -install.packages("finalfit") -library(broom) -library(broom.helpers) -library(tidymodels) -library(finalfit) -(.packages()) -### https://broom.tidymodels.org/ -### https://www.tidymodels.org/ - -### la base: le modéle 3: -mco4 # le plus compact: l'objet associé au modéle... -summary(mco4) # un peu plus complet... mais... -# regardons le bazar: -str(mco4) - -### avec broom on transforme les modéles bazars en beaux tibbles ! -t.mco4 <- tidy(mco4) # ah c'est plus beau ! -t.mco4 -# noter la colonne terme accessible avec $ ! -aug.mco4 <- augment(mco4) # on a un équivalent élargi du modéle -g.mco4 <- glance(mco4) # coup d'oeil aux diagnostics de régression ! -### accéder aux objets modéle ---- -names(mco4) - -modele4 <- c(t.mco4, aug.mco4, g.mco4) -modele4 - -write.csv2(modele4, "modele4.csv") -write.csv2(t.mco4, "t.mco4.csv") -write.csv2(aug.mco4, "aug.mco4.csv") -saveRDS(t.mco4, "t.mco4.rds") - -#### Exporter des résultats... -modele.4 <- c(glance(mco4), tidy(mco4), augment(mco4)) -glimpse(modele.4) # on a le modéle complet avec les données. -View(modele.4) -modele.4 - -### explorer avec finalfit -# https://finalfit.org/reference/finalfit.html -library(finalfit) -gapmind_2007_19 %>% missing_glimpse() -### utilisation missing compare à partir de : -# https://finalfit.org/reference/missing_compare.html -dependent <- "Stadev" -explicatives <- c("lifeExp", "pop", "gdpPercap", "urban_pop_2019", "age_median_2019", "GDI_2019", "GDP_GUSDPPP_2017") -gapmind_2007_19 %>% finalfit(dependent, explanatory) -# multi(.data, dependent, explanatory, ...) -multi(.data, dependent, explanatory, ...) # ...Other arguments to pass to - -# https://cran.r-project.org/web/packages/broom.helpers/vignettes/tidy.html -ibrary(broom.helpers) -# https://larmarange.github.io/broom.helpers/ -library(gtsummary) - -### méthode 1: force brute par factomineR: -install.packages("FactoMineR") -library(FactoMineR) - -write.infile(modele.4, file = "modele.4.xls", sep="\t") - -### méthode 2: plus subtile, plusieurs modéles dans un classeur xlsx. -modele.2 <- c(glance(mco2), tidy(mco2), augment(mco2)) -write.infile(modele.2, file = "modele.2.xls", sep="\t") # comme en 1 -modele.3 <- c(glance(mco3), tidy(mco3), augment(mco3)) -write.infile(modele.3, file = "modele.3.xls", sep="\t") # comme en 1 -### avec le paquetage openxlsx beaucoup plus souple: -install.packages("openxlsx") -library(openxlsx) -diagajust.4 <- glance(mco4) -tidy4 <- tidy(mco4) -augm4 <- augment(mco4) -modeles.4.gdi <- createWorkbook(creator = "Formation R Cired/IEDES", - title = "Exemple d'exportation d'objets en xlsx", - subject = "Exportation des modéles estimés", - category = "Résultats d'estimations") -addWorksheet(modeles.4.gdi, "diagnostics ajustement") -addWorksheet(modeles.4.gdi, "tidy_modele") -addWorksheet(modeles.4.gdi, "augment_modele") -writeData(modeles.4.gdi, "diagnostics ajustement", diagajust.4) -writeData(modeles.4.gdi, "tidy_modele", tidy4) -writeData(modeles.4.gdi, "augment_modele", augm4) -saveWorkbook(modeles.4.gdi, file = "Modeles.4.gdi.estimes.xlsx") - -### méthode 3: méme paquetage commande write.xlsx: -write.xlsx(modele.2, "modele.2.xlsx") -write.xlsx(modele.3, "modele.3.xlsx") -write.xlsx(modele.4, "modele.4.xlsx") - -### méthode 4: bloc note markdown -write.table(t.mco4, "modele.4.txt", sep="\t") -t.mco4 -write.table(aug.mco4, "aug.mco4.txt", sep="\t") -aug.mco4 - -### exemple de compilation d'un script via appel de commande markdown -rmarkdown::render("Exemple_compilation_de_script.R", "pdf_document") - - -#### olsrr ---- -library(olsrr) -t.mco4 -aug.mco4 -summary(mco4) - -### ols_regress === ressemble à stata -ols_regress(log(GDI_2019) ~ log(gdpPercap), - weights = pop, - data = filter(gapmind_2007_19, !is.na(gapmind_2007_19$GDI_2019))) -### mais c'est du stata dans R !!! -mco4.stata <- ols_regress(log(GDI_2019) ~ log(gdpPercap), - weights = pop, - data = filter(gapmind_2007_19, !is.na(gapmind_2007_19$GDI_2019))) -mco4.stata -### nous pouvons utiliser les commandes olsrr -# https://olsrr.rsquaredacademy.com/ -ols_plot_resid_fit(mco4) -ols_plot_dfbetas(mco4) -ols_plot_resid_fit_spread(mco4) -ols_plot_resid_qq(mco4) -ols_test_normality(mco4) -ols_plot_resid_hist(mco4) -### tests d'hétéroscédasticité -ols_test_breusch_pagan(mco4) -ols_test_breusch_pagan(mco4, rhs = TRUE, multiple = TRUE) -ols_test_breusch_pagan(mco4, rhs = TRUE, multiple = TRUE, p.adj = 'sidak') -ols_test_score(mco4) -ols_test_f(mco4) -# mesures d'influence -ols_plot_cooksd_bar(model) -require(ggpacman) -library(ggpacman) -animate_pacman( - pacman = pacman, - ghosts = list(blinky, pinky, inky, clyde), - font_family = "xkcd") From ad095b4636ca9fc03743acf669b638251d9d88ee Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:05:35 +0200 Subject: [PATCH 04/25] Delete README.md --- README.md | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 00c03f8..0000000 --- a/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# bricolR -Le séminaire R de la Cité du Développement Durable. -Ce séminaire est ouvert et de tous niveaux. On peut y présenter ses travaux en cours, résoudre des problèmes de code, présenter un paquetage qu'on l'on a trouvé utile et surtout partager des idées autour du langage R. -Ce répertoire met à disposition des personnes intéressées les scripts, markdown, quarto et données utilisées lors du séminaire. - -## séance du 27 juillet 2021 -tutoriels d'apprentissage de R. -Quelques liens utiles: - -1) liste des fonctions entrant dans summarize: - - https://www.r-bloggers.com/2021/06/summarize-in-r-data-summarization-in-r/ - - https://dplyr.tidyverse.org/reference/summarise.html - - https://www.rdocumentation.org/packages/Hmisc/versions/4.5-0/topics/summarize -2) gestion de la mémoire: - - http://adv-r.had.co.nz/memory.html -3) remplacer des na pour les appels de fonctions smartEdA: - - https://tidyr.tidyverse.org/reference/replace_na.html -4) liens sur le package smartEdA: - - https://cran.r-project.org/web/packages/SmartEDA/vignettes/SmartEDA.html#example-for-case-2-target-variable-is-continuous - - https://cran.r-project.org/web/packages/SmartEDA/vignettes/CustomTable.html - - https://cran.r-project.org/web/packages/SmartEDA/vignettes/SmartTwoPlots.html - - https://cran.r-project.org/web/packages/SmartEDA/vignettes/SmartEDA.html -5) liens utiles pour progresser: - - https://finnstats.com/index.php/2021/05/25/how-to-find-dataset-differences-in-r/ - - https://finnstats.com/index.php/2021/04/02/tidyverse-in-r/ - -Complements: -- https://ggplot2-book.org/index.html -- pour ceux qui viennent de stata, il existe un package qui reproduit do by de stata: https://cran.r-project.org/web/packages/doBy/index.html -- un des meilleurs tutos ggplot du net: https://www.cedricscherer.com/2019/08/05/a-ggplot2-tutorial-for-beautiful-plotting-in-r/ From 1f020df5a4f72533679efcafe24c13ba3da3a8a6 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:05:48 +0200 Subject: [PATCH 05/25] Delete analyses_descriptives.R --- analyses_descriptives.R | 360 ---------------------------------------- 1 file changed, 360 deletions(-) delete mode 100644 analyses_descriptives.R diff --git a/analyses_descriptives.R b/analyses_descriptives.R deleted file mode 100644 index 1d7cb6c..0000000 --- a/analyses_descriptives.R +++ /dev/null @@ -1,360 +0,0 @@ -############################################################################### -#### Analyses statistiques et exploratoires des donn?es gamind_2007_19 #### -############################################################################### - -### chargement des paquetages ---- -library(magrittr) # paquetage n?cessaire pour utiliser le tuyau ou pipe de programmation -library(gapminder) -library(tidyverse) -library(SmartEDA) -### d?finition du r?pertoire de travail ---- -setwd("D:/cours_R") -# https://thinkr.fr/debuter-avec-r-et-rstudio/ -#setwd("c:/Users/user/desktop/Cours_R") ### changez cela dans votre environnement -getwd() # afficher le r?pertoire de travail. -theme_set(theme_bw()) # pre-set the bw theme. - - -### on a un choix tr?s vaste de paquetages d'analyse. -# https://dabblingwithdata.wordpress.com/2018/01/02/my-favourite-r-package-for-summarising-data/ -# https://towardsdatascience.com/eda-in-r-with-smarteda-eae12f2c6094 - -### les r?sum?s classiques: ---- -# summary, fivenum, by(,summary) -summary(gapmind.2007.19[,"lifeExp"]) - - -summary(gapmind.2007.19$lifeExp) #notez la diff?rence avec la pr?c?dente commande - -summary(gapmind.2007.19) - -### on peut faire des r?sum?s selon les cat?gories d'un facteur -by(gapmind.2007.19, gapmind.2007.19$continent, summary) - -by(gapmind.2007.19, - list(gapmind.2007.19$continent, - gapmind.2007.19$HDI_Class), - summary) - -by(gapmind.2007.19, gapmind.2007.19$HDI_Class, summary) - -### on peut donc ?galement demander le r?sum? d'une seule variable: -by(gapmind.2007.19$lifeExp, gapmind.2007.19$continent, summary) -by(gapmind.2007.19$HDI_Class, gapmind.2007.19$continent, summary) -by(gapmind.2007.19[,"lifeExp"], gapmind.2007.19$continent, summary) -by(gapmind.2007.19[,"HDI_Class"], gapmind.2007.19$continent, summary) -### le dernier facteur, niveau de d?veloppement est peu pratique ? manier ! -# on peut le renommer pour l'utiliser: -gapmind.2007.19 <- rename(gapmind.2007.19, "Stadev" = "Developed / Developing Countries") -# attention ? la syntaxe: nouveau nom = ancien nom ! -# ne pas oublier l'affectation gapmind_2007_19 <- - -# https://dplyr.tidyverse.org/reference/rename.html - -# de m?me HDI_Class devrait ?tre red?fini en facteur: -gapmind.2007.19$HDI.Class <- as.factor(gapmind.2007.19$HDI_Class) # on maintenant un facteur - -by(gapmind.2007.19[,"HDI_Class"], gapmind.2007.19$Stadev, summary) -by(gapmind.2007.19[,"lifeExp"], gapmind.2007.19$Stadev, summary) - - -### via smart eda ---- -library(SmartEDA) # une suite de fonctions d'analyse descriptive pour le big data - -# https://www.rdocumentation.org/packages/SmartEDA/versions/0.3.8 -# https://github.com/daya6489/SmartEDA -# https://joss.theoj.org/papers/10.21105/joss.01509 - - -# Overview of the data - Type = 1 -ExpData(data = gapmind.2007.19, type = 1) # r?sum? g?n?ral des donn?es - -# Structure of the data - Type = 2 -ExpData(data = gapmind.2007.19, type = 2) # r?sum? plus d?taill? - -### r?sum?s des variables ----- -### ajouter exporter fichiers pour voir ! -# statistiques sur les variables num?riques -ExpNumStat(gapmind.2007.19, - by = "A", # r?sum? statistique pour toutes les variables Group = all - gp = NULL, # pas de variables pr?cis?e - Qnt = seq(0,1, 0.1), # quantiles ici d?ciles - MesofShape = 2, # mesures de forme == sym?trie et applatissement - Outlier = TRUE, # calcul des pivots de box plot et outresitu?s - round = 2, # arrondi ? deux d?cimales - Nlim = 10) # limite de valeurs num?riques diff?rentes -# mais on peut calculer selon un facteur: -ExpNumStat(gapmind.2007.19, - by = "G", # r?sum? statistique par Groupe - gp = "continent", # facteur = continent - Qnt = seq(0, 1, 0.1), # quantiles ici d?ciles - MesofShape = 2, # mesures de forme == sym?trie et applatissement - Outlier = TRUE, # calcul des pivots de box plot et outresitu?s - round = 2, # arrondi ? deux d?cimales - Nlim = 10) # limite de valeurs num?riques diff?rentes -# et on peut m?me faire les deux: par une variable et globalement: -ExpNumStat(gapmind.2007.19, - by = "GA", # r?sum? statistique pour toutes les variables Group + All - gp = "HDI_Class", # facteur == HDI_Class - Qnt = seq(0,1, 0.1), # quantiles ici quartiles 1 et 3 - MesofShape = 2, # mesures de forme == sym?trie et applatissement - Outlier = TRUE, # calcul des pivots de box plot et outresitu?s - round = 2, # arrondi ? deux d?cimales - Nlim = 10) # limite de valeurs num?riques diff?rentes -# En fait il faudrait enlever les NA en amont de la commande... - - -# statistiques des fr?quences sur les facteurs -ExpCTable(gapmind.2007.19, - Target = NULL, - margin = 1, - clim = 10, - nlim = 3, - round = 2, - bin = NULL, - per = T) # resultats en % des cat?gories du facteur per = TRUE -# l? aussi on peut choisir un facteur qui sera crois? avec les deux autres -# continent crois? avec hdi et stadev: -ExpCTable(gapmind.2007.19, Target = "continent", margin = 1, clim = 10, nlim = 3, round = 2, per = F) -# continent crois? avec hdi et stadev totaux en pourcentage colonne: -ExpCTable(gapmind.2007.19, Target = "continent", margin = 1, clim = 10, nlim = 3, round = 2, per = T) -# HDI_Class crois? avec hdi et stadev en % colonne: -ExpCTable(gapmind.2007.19, Target = "HDI_Class", margin = 1, clim = 10, nlim = 3, round = 2, per = T) -# HDI_Class crois? avec hdi et stadev en % ligne (margin = 2): -ExpCTable(gapmind.2007.19, Target = "HDI_Class", margin = 2, clim = 10, nlim = 3, round = 2, per = T) - - -### une analyse du degr? d'association des variables ? chaque facteur: -catstat <- ExpCatStat(gapmind.2007.19, Target = "continent", result = "Stat", clim = 10, nlim = 10) -class(catstat) - -# idem avec result = IV (information value) -ExpCatStat(gapmind.2007.19, Target = "continent", result = "IV", clim = 10, nlim = 10) -# de mani?re int?ressante il a red?coup? toutes les variables continues en classes ! -# de toute ?vidence, les autres variables n'ont pas de pouvoir pr?dictif de continent... - -### changeons de variables cible: -ExpCatStat(gapmind.2007.19, Target = "HDI_Class", result = "Stat", clim = 10, nlim = 10) -ExpCatStat(gapmind.2007.19, Target = "Stadev", result = "Stat", clim = 10, nlim = 10) - -### probl?me ! SmartEDA semble ne pas aimer les NAs ! -summary(gapmind.2007.19) -# on pourrait filter la base de travail pour retirer les valeurs manquantes: -gapmind.07.19.hdi <- filter(gapmind.2007.19, !is.na(gapmind.2007.19$HDI_Class)) # noter ! - -glimpse(gapmind.07.19.hdi) -summary(gapmind.07.19.hdi) -str(gapmind.07.19.hdi) - -## exemple replace_na() : https://tidyr.tidyverse.org/reference/replace_na.html -(df <- tibble(x = c(1, 2, NA), y = c("a", NA, "b"))) -(df %>% replace_na(list(x = 0, y = "unknown"))) - -gapmind.na.omit <- na.omit(gapmind.2007.19) -summary(gapmind.na.omit) # gapmind sans aucune donnée manquante. - -gapmind.2007.19.replace_na <- gapmind.2007.19 -summary(gapmind.07.19.hdi$Stadev) - -gapmind.07.19.hdi %>% - mutate(Stadev = replace_na(Stadev, "missing")) -summary(gapmind.07.19.hdi$Stadev) - -gapmind.2007.19$Stadev <- replace_na("missing") -gapmind.2007.19$Stadev -View(gapmind.2007.19) - -### différences d'objets listes et vecteurs. -# un vecteur numérique: -v <- c(2, 4, 3.2, 5.9, 6.0001) -v -class(v) -mode(v) - -(3*v) - -(w <- c(2, 6, TRUE, "Alice", NA)) -class(w) - -(z <- c(2, 6, TRUE, 1e6, NA)) -class(z) - -(list.1 <- list(4, 6, TRUE, "Alice", NA)) - -class(gapmind.2007.19$Stadev) -mode(gapmind.2007.19$Stadev) -summary(gapmind.2007.19$Stadev) - -by(gapmind.07.19.hdi, gapmind.07.19.hdi$HDI.Class, summary) - -# on retir? les NA dans le facteur hdi.class: -ExpCatStat(gapmind.07.19.hdi, Target = "HDI.Class", result = "Stat", clim = 10, nlim = 10) -# cela devient plus convaincant et int?ressant ! -ExpCatStat(gapmind.07.19.hdi, Target = "HDI.Class", result = "IV", bins = 5, clim = 5, nlim = 5) -ExpCatStat(gapmind.07.19.hdi, Target = "HDI.Class", result = "IV", Pclass = 2, bins = 5, clim = 5, nlim = 5) - -summary(gapmind.07.19.hdi$HDI.Class) - -### r?sum?s statistiques des variables quantitatives avec ExpNumStat -hdi.exp.num <- ExpNumStat(gapmind.07.19.hdi, - by = "A", # r?sum? statistique pour toutes les variables Group = all - gp = "GDI_2019", # pas de variables pr?cis?e - Qnt = seq(0,1,0.1), # quantiles ici d?ciles - MesofShape = 2, # mesures de forme == sym?trie et applatissement - Outlier = TRUE, # calcul des pivots de box plot et outresitu?s - round = 2, # arrondi ? deux d?cimales - Nlim = 10) # limite de valeurs num?riques diff?rentes -View(hdi.exp.num) -### lorsque la variable cible est continue, il calcule des corr?lations -gapmind.07.19.gdi <- filter(gapmind.2007.19, !is.na(gapmind.2007.19$GDI_2019)) - -gapmind.07.19.na <- filter(gapmind.2007.19, is.na(gapmind.2007.19$GDI_2019)) - -summary(gapmind.07.19.gdi$GDI_2019) -summary(gapmind.07.19.na) -#changement du nom de Stadev -rename(gapmind.07.19.gdi, "Stadev" = "Developed / Developing Countries") -rename(gapmind.07.19.na, "Stadev" = "Developed / Developing Countries") - -by(gapmind.07.19.na, gapmind.07.19.na$continent, summary) -by(gapmind.07.19.na, gapmind.07.19.na$HDI_Class, summary) - -ExpNumStat(gapmind.07.19.gdi, - by = "A", # r?sum? statistique pour toutes les variables Group = all - gp = "GDI_2019", # pas de variables pr?cis?e - Qnt = seq(0,1,0.1), # quantiles ici d?ciles - MesofShape = 2, # mesures de forme == sym?trie et applatissement - Outlier = TRUE, # calcul des pivots de box plot et outresitu?s - round = 2, # arrondi ? deux d?cimales - Nlim = 10) # limite de valeurs num?riques diff?rentes -### il faut donc retirer les NAs pour obtenir des r?sultats probants - - -# Remarquez les corr?latons finales sont NA pour les variables comptant des NA ==> -# le plus direct serait de retirer tous les NA... -# rm(gampind_07_19_nona) - -gapmind.07.19.nona <- na.omit(gapmind.2007.19) # sauf que nous perdons 32 pays sur 142 ! - -32/142 # soit 23% ! - -summary(gapmind.07.19.nona) - -# reprenons -ExpData(data = gapmind.07.19.nona, type = 1) # on voit qu'il n'y a plus de NA -ExpData(data = gapmind.07.19.nona, type = 2) # on voit qu'il n'y a plus de NA - -### résumé de type A avec comme variable cible == GDI_2019 -cor.GDI.2019 <- ExpNumStat(gapmind.07.19.nona, - by = "A", # r?sum? statistique pour toutes les variables Group = all - gp = "GDI_2019", # pas de variables pr?cis?e - Qnt = seq(0,1,0.1), # quantiles ici d?ciles - MesofShape = 2, # mesures de forme == sym?trie et applatissement - Outlier = TRUE, # calcul des pivots de box plot et outresitu?s - round = 2, # arrondi ? deux d?cimales - Nlim = 10) -# on note la correlation n?gative avec l'indice d'in?galit?s de genre et nulle avec le pib ! -(ExpNumStat(gapmind.07.19.nona, - by = "A", # r?sum? statistique pour toutes les variables Group = all - gp = "GNI_2019", # pas de variables pr?cis?e - Qnt = seq(0,1,0.1), # quantiles ici d?ciles - MesofShape = 2, # mesures de forme == sym?trie et applatissement - Outlier = TRUE, # calcul des pivots de box plot et outresitu?s - round = 2, # arrondi ? deux d?cimales - Nlim = 10)) - -(ExpNumStat(gapmind.07.19.nona, -by = "A", # r?sum? statistique pour toutes les variables Group = all -gp = "Gender_Inequality_2019", # pas de variables pr?cis?e -Qnt = seq(0,1,0.1), # quantiles ici d?ciles -MesofShape = 2, # mesures de forme == sym?trie et applatissement -Outlier = TRUE, # calcul des pivots de box plot et outresitu?s -round = 2, # arrondi ? deux d?cimales -Nlim = 10)) - -### Calculs de coefficients d'applatissment: -ExpKurtosis(gapmind.2007.19$GDI_2019, type = "moment") -ExpKurtosis(gapmind.2007.19$GDI_2019, type = "excess")# kurtosis = moment de degr? 4 -ExpKurtosis(gapmind.2007.19$gdpPercap, type = "excess") # moment - 4 - -### exploration d'outresitu?s: -boxout.gapmind <- ExpOutliers(gapmind.2007.19, - varlist = c("GDI_2019", "gdpPercap", "lifeExp", "Gender_Inequality_2019"), - method = 'Boxplot', - capping = c(0.05, 0.95)) # d?finitions du boxplot -View(boxout.gapmind) -boxout.gapmind - -stdout.gapmind <- ExpOutliers(gapmind.2007.19, - varlist = c("GDI_2019", "gdpPercap", "lifeExp", "Gender_Inequality_2019"), - method = '2xStDev', - capping = c(0.05, 0.95)) # d?finition de nombre d'?carts-types -stdout.gapmind -str(stdout.gapmind) -class(stdout.gapmind) -mode(stdout.gapmind) - -stdout.gapmind$outlier.index$lower.out.index$lifeExp -stdout.gapmind$outlier.index$upper.out.index - -### ExpReport ==> cr?er rapport avec markdown ---- -### ExpReport -install.packages("markdown") -library(markdown) -### rapport sur la base compl?te ! -ExpReport(gapmind.2007.19, op_file = "rapport.gapminder.html") -# idem mais avec une variable continue cible : GDI_2019 -ExpReport(gapmind.2007.19, Target = "GDI_2019", op_file = "rapp.GDI_2019.html") -# idem avec facteur : HDI_Class -ExpReport(gapmind_2007_19, Target = "Stadev", theme = "stata", op_file = "rapp.stadev.html") - -# exploration de donn?es manquantes: -# https://cran.r-project.org/web/packages/finalfit/index.html -# https://cran.r-project.org/web/packages/finalfit/vignettes/missing.html -install.packages("finalfit") -install.packages("visdat") -# paquetage naniar -# https://cran.r-project.org/web/packages/naniar/index.html -# https://cran.r-project.org/web/packages/naniar/vignettes/getting-started-w-naniar.html -# https://cran.r-project.org/web/views/MissingData.html -# https://cran.r-project.org/web/views/MissingData.html#exploration -# https://cran.r-project.org/web/views/MissingData.html -# -library(naniar) -library(visdat) -library(finalfit) -(.packages()) - -gapmind.2007.19 %>% - missing_plot() - -explanatory <- c("gdpPercap", "urban_pop_2019", "lifeExp", "age_median_2019") -dependent <- "GDI_2019" - -gapmind.2007.19 %>% - missing_pattern(dependent, explanatory) - -comb <- c(gapmind.2007.19, boxout.gapmind) -comb - -View(comb) -gapmind.data <- as.data.frame(comb[1:17]) -class(gapmind.data) -View(gapmind.data) - - -comb$continent -glimpse(comb) - - - -class(comb) -mode(comb) -str(comb) - -library(visdat) -vis_dat(gapmind.2007.19) -gapmindat <- gapminder -vis_dat(gapmindat) -vis_dat(UNSD_Regions) - From c05e94bff9dcdf79f3a796d1adc5603f1e5a4d58 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:06:01 +0200 Subject: [PATCH 06/25] Delete bricolageR.R --- bricolageR.R | 242 --------------------------------------------------- 1 file changed, 242 deletions(-) delete mode 100644 bricolageR.R diff --git a/bricolageR.R b/bricolageR.R deleted file mode 100644 index 3d3ee88..0000000 --- a/bricolageR.R +++ /dev/null @@ -1,242 +0,0 @@ -######## premier script exemple de script -# juste p?ur voir... - -#### section 1 ----- - - -# c'est du commentaire - -#### section 2 ---- - - -### chargement des paquetages ---- -library(magrittr) # paquetage n?cessaire pour utiliser le tuyau ou pipe de programmation -library(gapminder) -library(tidyverse) -install.packages("gapminder") -install.packages("data.table") - -(.packages()) - -### d?finition du r?pertoire de travail ---- -setwd("D:/cours_R") -setwd("c:/Users/user/desktop/Cours_R") ### changez cela dans votre environnement -getwd() # afficher le r?pertoire de travail. -theme_set(theme_bw()) # pre-set the bw theme. - -theme_set(theme_bw()) -theme_get() - -# afficher les paquetages charg?s -(.packages()) # noter le . qui est une variable d'environnement R -# afficher tous les paquetages (notez la diff?rence) -library() -(.Rdata) - - -### premiers pas avec gapminder ---- -# un extrait des wdi de la banque mondiale: https://www.gapminder.org/data/ -? gapminder -? library -str(gapminder) # examiner la structure d'un objet R arbitraire -class(gapminder) -? tibble -mode(gapminder) - -head(gapminder) # visualiser les quelques premi?res lignes d'un cadre de donn?es -tail(gapminder) # on peut regarder les derni?res lignes par tail(df) -head(gapminder, 20) # visualiser les 20 premi?res lignes d'un cadre de donn?es -tail(gapminder, 20) # les vingt derni?res lignes -head(gapminder, -6L) # on n?glige les six derni?res lignes -head(gapminder, n = c(20, 2)) # on peut visualiser des blocs en pr?cisant par un vecteur -# ici c(20,2) -tail(gapminder, n = c(20, -2)) # en pr?cisant -2 dans le vecteur, la fonction comprend -# qu'il faut n?gliger les deux premi?res colonnes mais cela nous g?ne un peu ici: - -# pour des ?l?ments sur l'indexation des R, voir: -# # http://www.cookbook-r.com/Basics/Indexing_into_a_data_structure/ - -### fonction glimpse (aper?u) -glimpse(gapminder) # glimpse == aper?u des donn?es ! Noter la transposition comme dans str() -glimpse(gapminder::continent_colors) # une variable du paquetage gapminder -View(gapminder) # ouvrir la visionneuse de donn?es -### c'est done un panel de s?ries temporelles par pays dans l'ordre alphab?tique -?View -View(gapminder) -glimpse(gapminder$pop) - -### synth?se des donn?es ----- -### premiers r?sum?s: -summary(gapminder) # r?sum?s de base - -class(gapminder$continent) -mode(gapminder$continent) -table(gapminder$continent) # continent == d?coupage ONU -table(gapminder$year) -table(gapminder$country) - - -### creation d'un objet tableau r?sumant les donn?es par continent pour 2007 -continent <- gapminder %>% - filter(year == 2007) %>% - group_by(continent) %>% - summarize(lifeExp = median(lifeExp)) -continent -View(continent) -str(continent) - -## variance de l'espérance de vie -continent.V.LE <- gapminder %>% - filter(year == 2007) %>% - group_by(continent) %>% - summarize(lifeExp = var(lifeExp)) -continent.V.LE - -### on peut regrouper selon l'ann?e et le continent: -#library(magrittr) -(.packages()) - -continent.yr <- gapminder %>% - group_by(year, continent) %>% - summarize(lifeExp = median(lifeExp)) -continent.yr -str(continent.yr) # il est en format long mais cela pourra ?tre utile pour les graphiques - -### resum? inverse: -continent.ct <- gapminder %>% - group_by(continent, year) %>% - summarize(lifeExp = median(lifeExp)) -continent.ct -str(continent.ct) - -### on peut aussi grouper plusieurs r?sum?s: -continent.median <- gapminder %>% - filter(year == 2007) %>% - group_by(continent) %>% - summarize(lifeExp = median(lifeExp), - gdp_pc = median(gdpPercap), - pop = median(pop), - countries = n()) # il suffit donc de pr?ciser les r?sum?s voulus -continent.median -str(continent.median) - -### on finit sur le resum? m?dian en format long avec ann?es et 4 indicateurs -continent.median.ct <- gapminder %>% - group_by(continent, year) %>% - summarize(lifeExp = median(lifeExp), - gdp.pc = median(gdpPercap), - pop = median(pop), - countries = n()) # il suffit donc de pr?ciser les r?sum?s voulus -continent.median.ct -str(continent.median.ct)# structure plus complexe du tibble -summary(continent.median.ct) - - - - - -### comment ensuite joindre gapminder avec les indicateurs de genr?s de l'ONU -(gapmind.2007 <- gapminder %>% - filter(year == 2007)) - -gapmind.2007 -head(gapmind.2007, 20) -glimpse(gapmind.2007) -str(gapmind.2007) # tout est ok ! -glimpse(gapmind.2007) - -### importation des indicateurs du d?veloppement humain ONU - -# http://hdr.undp.org/en/content/download-data - -#rm(ONU_HDI) -View(ONU_HDI) -head(ONU_HDI) -glimpse(ONU_HDI) -str(ONU_HDI) -summary(ONU_HDI) -### nous voici tr?s embarass?s: les variables sont cod?es en caract?res ! -# que s'est-il pass? ? l'importation ? -# Rstudio a consid?r? les variables avec des caract?res textes comme textes ! -# les caract?res ".." ne sont pas conformes dans R. Ce sont des donn?es manquantes -#on les remplace par une valeur valide: NA. -install.packages("naniar") -(R.version) -library(naniar) -# https://cran.r-project.org/web/packages/naniar/vignettes/replace-with-na.html -ONU_HDI %>% replace_with_na_all(condition = ~. == "..") -str(ONU_HDI) -str(gapmind.2007) -summary(ONU_HDI) -### nous allons, changer les caract?ristiques des colonnes du tibble ONU_HDI -ONU_HDI$Country <- as.factor(ONU_HDI$Country) -ONU_HDI$HDI_Class <- as.factor(ONU_HDI$HDI_Class) -ONU_HDI$Rang_HDI_2019 <- as.numeric(ONU_HDI$Rang_HDI_2019) -ONU_HDI$age_median_2019 <- as.numeric(ONU_HDI$age_median_2019) -ONU_HDI$Gender_Inequality_2019 <- as.numeric(ONU_HDI$Gender_Inequality_2019) -ONU_HDI$GDI_2019 <- as.numeric(ONU_HDI$GDI_2019) -ONU_HDI$GDI_Group_2019 <- as.numeric(ONU_HDI$GDI_Group_2019) -ONU_HDI$GNI_2019 <- as.numeric(ONU_HDI$GNI_2019) -ONU_HDI$GDP_GUSDPPP_2017 <- as.numeric(ONU_HDI$GDP_GUSDPPP_2017) - - -### En fait on peut importer correctement tout cela avec readxl -# recommen?ons -View(ONU_HDI) -head(ONU_HDI) -glimpse(ONU_HDI) -str(ONU_HDI) -summary(ONU_HDI) -# tout est ok sauf les deux premi?res colonnes qui sont en caract?res... -#https://cran.r-project.org/web/packages/WDI/index.html - -### fichiers ONU r?gions: -# https://unstats.un.org/unsd/methodology/m49/overview/ -View(UNSD_Regions) -head(UNSD_Regions) -glimpse(UNSD_Regions) -str(UNSD_Regions) -summary(UNSD_Regions) -(.packages()) -### on apparie les bases ONU_HDI et UNSD_Regions -# tout d'abord on vire les huit premi?res colonnes de UNSD_Regions -UNSD_Regions <- select(UNSD_Regions, -c(1:8)) # force brute mais ?a marche! -write.csv2(UNSD_Regions, "UNSD_Regions.csv") -# on fait ensuite la jointure ? gauche de - -# https://dplyr.tidyverse.org/reference/mutate-joins.html - -ONU <- left_join(ONU_HDI, UNSD_Regions, by = c("Country" = "Country or Area")) -View(ONU) -head(ONU, 20) -glimpse(ONU) -str(ONU) -# tout a parfaitement march? et on peut donc faire une jointure gauche sur ONU -summary(ONU) # avant cela on va se d?barasser des colonnes 13--17 -ONU <- select(ONU, -c(13:17)) # attention ! bien distinguer c(13,17) de c(13:17) -glimpse(ONU) -ONU <- select(ONU, -c(12)) -# on transforme la derni?re colonne en facteur: -ONU$`Developed / Developing Countries` <- as.factor(ONU$`Developed / Developing Countries`) - - -### on peut maintenant op?rer la jointure ? gauche sur gapminder_2007: -gapmind.2007.19 <- left_join(gapmind.2007, ONU, by = c("country" = "Country")) -View(gapmind.2007.19) -head(gapmind.2007.19, 20) -tail(gapmind.2007.19, 25) -glimpse(gapmind.2007.19) -str(gapmind.2007.19) -summary(gapmind.2007.19) -str(ONU) - -gapmind.2007.19$HDI_Class <- as.factor(gapmind.2007.19$HDI_Class) -(.packages()) -### exercices: -# 1. construire un r?sum? de gapmind_2007_19 regroup? par : continents, classes d'hdi et niveau de developpement -# 2. examiner la jointure ? droite et compl?te de gapmind_2007 avec ONU : que constatez vous ? -# 3. sur la modification de ONU tester la difference entre c(13,17) et c(13:17) comment corrigeriez-vous ? -# 4. trouver quelques questions. - -#changement du nom de Stadev -rename(gapmind.2007.19, "Stadev" = "Developed / Developing Countries") From 75fbed7081a60e44a32aa0ab292c51b154c88c5a Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:06:17 +0200 Subject: [PATCH 07/25] Delete corrplot_ou_ggplot_representer_correlations.R --- corrplot_ou_ggplot_representer_correlations.R | 76 ------------------- 1 file changed, 76 deletions(-) delete mode 100644 corrplot_ou_ggplot_representer_correlations.R diff --git a/corrplot_ou_ggplot_representer_correlations.R b/corrplot_ou_ggplot_representer_correlations.R deleted file mode 100644 index 246b08e..0000000 --- a/corrplot_ou_ggplot_representer_correlations.R +++ /dev/null @@ -1,76 +0,0 @@ -### représenter une matrice de corrélations dans ggplot en mosaiques -# https://stackoverflow.com/questions/39136211/title-in-r-corrplot-too-not-centred-and-too-high - - -# problèmes de titres avec corrplot: -# https://stackoverflow.com/questions/40509217/how-to-have-r-corrplot-title-position-correct -# https://github.com/taiyun/corrplot/issues/10 -# changer noms de variables dans corrplot: -# https://github.com/taiyun/corrplot/issues/20 - -# très éclairant: -# https://stackoverflow.com/questions/41679136/r-corrplot-crops-bottom-axis-label - -#### solution corrplot ----- -"VADeaths" <- - structure(c(11.7, 18.1, 26.9, 41, 66, 8.7, 11.7, 20.3, 30.9, 54.3, 15.4, - 24.3, 37, 54.6, 71.1, 8.4, 13.6, 19.3, 35.1, 50), .Dim = c(5, 4), - .Dimnames = list(c("50-54", "55-59", "60-64", "65-69", "70-74"), - c("Rural Male", "Rural Female", "Urban Male", "Urban Female"))) - -library(corrplot) -cors = cor(VADeaths) -corrplot(cors,tl.col="black",title="Example Plot",mar=c(0,0,5,0),tl.offset = 1) -### mexte et options mar attention aux options tl. elles s'appliquent aux différents éléments de texte -corrplot(cors,tl.col="black", mar=c(0,0,5,0), tl.offset = 1) -mtext("Example Plot", at=2.5, line=-0.5, cex=2) - - -#### reshape et mosaique ggplot ---- - -library(reshape2) -cors <- cor(VADeaths) -cor_data <- reshape2::melt( - cors, - varnames = paste0("demographic", 1:2), - value.name = "correlation" -) - -Then draw the plot. - -library(ggplot2) -ggplot(cor_data, aes(demographic1, demographic2, fill = correlation)) + - geom_tile() + - ggtitle("Correlation across demographics for VA deaths") - -# emploi de tl.offset: -# https://stackoverflow.com/questions/5359619/r-change-size-of-axis-labels-for-corrplot - -# un autre stacks: -# https://stackoverflow.com/questions/39029526/how-to-change-the-margins-of-a-correlation-matrix-plot - -library(corrplot) -cor_matrix <- structure(c(1, 0.31596392056465, -0.120092224085334, -0.345097115278159, - 0.31596392056465, 1, 0.158912865564527, -0.606426850726639, -0.120092224085334, - 0.158912865564527, 1, -0.134795548155303, -0.345097115278159, - -0.606426850726639, -0.134795548155303, 1), .Dim = c(4L, 4L), - .Dimnames = list(NULL, c("var_1", "var_2", "var_3", "var_4"))) - -corrplot.mixed(cor_matrix, order = "AOE", upper = "ellipse", lower = "number", - tl.cex = 2, cl.cex = 2, number.cex = 2) - -### réponse possible demandant autre package: -library(corrplot) -library(scico) - -col4 <- scico(100, palette = 'vik') # définition d'une palette par scico -filetag <- "corrplot_result.png" - -png(filetag, height = 800, width = 800) # création d'un fichier png ! - -corrplot.mixed(cor_matrix, order = "AOE", upper = "ellipse", lower = "number", - upper.col = col4, lower.col = col4, - tl.cex = 2, cl.cex = 2, number.cex = 2) -dev.off() -# https://www.r-graph-gallery.com/74-margin-and-oma-cheatsheet.html -# https://bookdown.org/ndphillips/YaRrr/arranging-plots-with-parmfrow-and-layout.html From c13923071cab84ae991210f7e29309fa2d0ef18b Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:06:28 +0200 Subject: [PATCH 08/25] Delete exemple_powerpoint.Rmd --- exemple_powerpoint.Rmd | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 exemple_powerpoint.Rmd diff --git a/exemple_powerpoint.Rmd b/exemple_powerpoint.Rmd deleted file mode 100644 index 6629446..0000000 --- a/exemple_powerpoint.Rmd +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: "Exemple creation powerpoint" -author: "Franck Nadaud" -date: "2024-01-25" -output: pdf_document ---- - -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -``` - -## R Markdown - -This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see . - -When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this: - ---- - -```{r cars} -summary(cars) -``` - -## Including Plots - -You can also embed plots, for example: - ---- - -```{r pressure, echo=FALSE} -plot(pressure) -``` - -Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot. From bcc6dae38728e664fc0effd1e09a6527e2aa3737 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:06:38 +0200 Subject: [PATCH 09/25] Delete exemple_powerpoint_2.Rmd --- exemple_powerpoint_2.Rmd | 44 ---------------------------------------- 1 file changed, 44 deletions(-) delete mode 100644 exemple_powerpoint_2.Rmd diff --git a/exemple_powerpoint_2.Rmd b/exemple_powerpoint_2.Rmd deleted file mode 100644 index 6afde84..0000000 --- a/exemple_powerpoint_2.Rmd +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: "Exemple creation powerpoint" -author: "Franck Nadaud" -date: "2024-01-25" -output: - powerpoint_presentation: - reference_doc: PPT_cired_bleu_vide.pptx ---- - -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -``` - -## R Markdown - -This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see . - -When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this: - ------------------------------------------------------------------------- - -```{r cars} -summary(cars) -``` - -## Including Plots - -You can also embed plots, for example: - ------------------------------------------------------------------------- - -```{r pressure, echo=FALSE} -plot(pressure) -``` - -Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot. - ------------------------------------------------------------------------- - -On peut même écrire des équations. - -$$ -w_i = a + bx_i+cy_i + \epsilon_i -$$ From 4d3eed8d9cdcde505654af96baee54349c59de30 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:06:51 +0200 Subject: [PATCH 10/25] Delete exemple_word.Rmd --- exemple_word.Rmd | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 exemple_word.Rmd diff --git a/exemple_word.Rmd b/exemple_word.Rmd deleted file mode 100644 index 0bd9dc8..0000000 --- a/exemple_word.Rmd +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: "Exemple" -author: "Franck Nadaud" -date: "2024-01-25" -output: word_document ---- - -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -``` - -## R Markdown - -This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see . - -When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this: - -```{r cars} -summary(cars) -``` - -## Including Plots - -You can also embed plots, for example: - -```{r pressure, echo=FALSE} -plot(pressure) -``` - -Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot. From 93b867d4a920637901c9b5ac67a034f5345c7e49 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:07:01 +0200 Subject: [PATCH 11/25] Delete ggplot.R --- ggplot.R | 392 ------------------------------------------------------- 1 file changed, 392 deletions(-) delete mode 100644 ggplot.R diff --git a/ggplot.R b/ggplot.R deleted file mode 100644 index ddd2469..0000000 --- a/ggplot.R +++ /dev/null @@ -1,392 +0,0 @@ -############################################################################### -###### graphismes en ggplot ############ -############################################################################### - -### chargement des paquetages ---- -library(magrittr) # paquetage n?cessaire pour utiliser le tuyau ou pipe de programmation -library(gapminder) -library(tidyverse) -library(SmartEDA) -(.packages()) -### d?finition du r?pertoire de travail ---- -setwd("D:/cours_R") -#setwd("c:/Users/user/desktop/Cours_R") ### changez cela dans votre environnement -getwd() # afficher le r?pertoire de travail. -theme_set(theme_bw()) # pre-set the bw theme. - -### pr?lude ? ggpplot: fonctions graphiques de smarteda ---------- -# https://towardsdatascience.com/eda-in-r-with-smarteda-eae12f2c6094 -# les fonctions de SmartEDA encapsulent des commandes ggplot2 pr?d?finies - -#### graphiques basiques : Variables quantitatives --- - -## Par d?faut, ExpNumViz calcule des distributions par noyaux des variables quantitatives -densites_gapmind <- ExpNumViz(gapmind.2007.19, - target = NULL, - nlim = 10, - Page = c(3,3)) -densites_gapmind[[1]] # notez la subtilit? de l'indexation double crochet: -class(densites_gapmind) -double <- densites_gapmind[[1]] -class(double) -mode(double) - -simple <- densites_gapmind[1] -class(simple) -mode(simple) - -# https://cran.r-project.org/doc/manuals/R-lang.html#Indexing -mode(densites_gapmind) # c'est une liste d'objets -class(densites_gapmind) # de classe liste -str(densites_gapmind) -# c'est donc une liste compos?e de 1 objet contenant 3 gtable - - -### variables qualitatives: -ciredium <- rgb(67, 135, 135, max = 255) -class(ciredium) -library(RColorBrewer) -(.packages()) -display.brewer.all() - -barres_gapmind <- ExpCatViz(gapmind.2007.19, - target = NULL, - col = ciredium, - clim = 10, - margin = 2, - Page = c(2,1)) -barres_gapmind[[1]] -barres_gapmind -class(barres_gapmind) -mode(barres_gapmind) -str(barres_gapmind) - -### En fait, lorsque target = NULL, les autres param?tres sont ignor?s, -# il g?n?re les courbes de densit? de toutes les variables selon page etc. - -# https://www.datamentor.io/r-programming/color/ -rgb(67,135,135, max = 255) -ciredium <- "#438787" - -barres_HDI_Class <- ExpCatViz(gapmind.2007.19, - target = "HDI_Class", - col = NULL, - clim = 10, - margin = 2, - Page = c(2,1)) -barres_HDI_Class[[1]] - - - -# choisissons une variables quantitative : -graph_GDI_2019 <- ExpNumViz(gapmind_2007_19[,-2], target = "GDI_2019", nlim = 10, Page = c(2,2)) -graph_GDI_2019[[1]] # on obtient une liste de nuages de points entre le GDI_2019. - -# si on execute la commande sans l'affecter ? un objet on obtient ceci: -ExpNumViz(gapmind_2007_19[,-2], target = "GDI_2019", nlim = 10, Page = c(2,2)) #notez qu'il ignore l'indice -2 ! - -### on peut aussi des pr?ciser des variables cibles, toujours en indexant: -ExpNumViz(gapmind_2007_19, target = "GDI_2019", nlim = 10)[4:6] -ExpNumViz(gapmind_2007_19, target = "GDI_2019", nlim = 10, - gtitle = "Indicateur de d?veloppement genr?", theme = "Default") -titre_GDI_2019 <- ExpNumViz(gapmind_2007_19, target = "GDI_2019", nlim = 10, - gtitle = "Indicateur de d?veloppement genr?", theme = "Default", Page = c(2,2)) -titre_GDI_2019[[1]] -ExpNumViz(gapmind_2007_19, scatter = TRUE) # noter l'index relatif - -### cible == variable qualitative -ExpNumViz(gapmind_2007_19, target = "GDI_Group_2019", nlim = 10, - gtitle = "Indicateur de d?veloppement genr?", theme = "Default") -box_hdi_class <- ExpNumViz(gapmind_2007_19, target = "HDI_Class", nlim = 10, - gtitle = "Variables quantitatives par groupe HDI", theme = "Default") -box_hdi_class[[4]] -rm(box_hdi_class) -ExpNumViz(gapmind_2007_19, target = "HDI_Class", nlim = 10, - gtitle = "Variables quantitatives par groupe HDI", theme = "Default") - -# http://adv-r.had.co.nz/Subsetting.html -# https://bookdown.org/rdpeng/rprogdatascience/subsetting-r-objects.html - -### graphiques quantiles-quantiles ---- -gapmindQQ <- ExpOutQQ(gapmind.2007.19, - nlim = 10, - Page = c(2,2)) -gapmindQQ -ExpOutQQ(gapmind.2007.19, nlim = 10) - -### coordonn?es parall?les ----- -ExpParcoord(gapmind.2007.19, Nvar = c("GDI_2019", "gdpPercap", "lifeExp", "Gender_Inequality_2019")) -ExpParcoord(gapmind.2007.19, - Group = "continent", - Nvar = c("GDI_2019", "gdpPercap", "lifeExp", "Gender_Inequality_2019")) -ExpParcoord(gapmind.2007.19, - Group = "Stadev", - Nvar = c("GDI_2019", "Gender_Inequality_2019", "gdpPercap", "lifeExp")) -ExpParcoord(gapmind.2007.19, - Group = "HDI_Class", - Nvar = c("GDI_2019", "Gender_Inequality_2019", "gdpPercap", "lifeExp", "urban_pop_2019")) - - -### ajouter passage sur corrplot. -# https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html -# http://www.sthda.com/french/wiki/visualiser-une-matrice-de-correlation-par-un-correlogramme - -### visualisons les corr?lations avec le paquetage corrplot -# on doit va utiliser la m?thode corrplot... -library(corrplot) -# Elle n'admet que des donn?es num?riques en entr?e et g?re les NA -# pour cela il faut calculer une matrice de corr?lation ds donn?es avec cor() -gapcor <- cor(gapmind.2007.19[,c(4:6,8:16)], use = "complete.obs") # on a vir? les NAs -round(gapcor,2) # on demande d'afficher la matrice avec deux d?cimales -class(gapcor) -View(gapcor) -# il pourrait ?tre int?ressant d'utiliser les corr?lations de rangs (sur des classements) -gapcor.kendall <- cor(gapmind.2007.19[,c(4:6,8:16)], use = "complete.obs", method = "kendall") -round(gapcor.kendall,2) ### notez la diff?rence entre les deux matrices ! -gapcor.spearman <- cor(gapmind.2007.19[,c(4:6,8:16)], use = "complete.obs", method = "spearman") -round(gapcor.spearman,2) ### notez la diff?rence entre les deux matrices ! - -### corrplot admet une matrice de correlation entr?e -corrplot(gapcor, method = "circle") # corrplot admet en entr?e une matrice corr?lation -corrplot(gapcor.kendall, method = "circle") # noter les diff?rences avec la premi?re matrice -corrplot(gapcor.spearman, method = "circle") # noter les diff?rences avec la premi?re matrice - -### on peut changer de m?thodes de visualisation: -corrplot(gapcor, method = "pie") # des secteurs... noter les corr?lations tr?s faibles de pop -corrplot(gapcor, method = "color") # des cases color?es -corrplot(gapcor, method = "number") # le coefficient -corrplot(gapcor, method = "ellipse") # cercle allong? dans la direction de corr?lation -corrplot(gapcor, method = "shade") # la case color?e avec une hachure pour les n?gatives -### ou encore l'implantation -corrplot(gapcor, method = "ellipse", type = "upper") # aussi "lower", defaut = "full" -# changer l'aspect et les couleurs: -col.cor <- colorRampPalette(c("red", "white", "blue"))(20) -corrplot(gapcor, method = "color", col = col.cor) # une ?chelle ? 21 ?chelons -corrplot(gapcor, method = "circle", col = c("black", "white"), bg = "#438787") # noir blanc, fond ciredium ! - -### l'int?r?t de corrplot est qu'il propose une selection d'options int?ressantes -# l'analyse exploratoire: la plus int?ressante est de r?ordonner les variables de la matrice: -corrplot(gapcor, method = "ellipse", order = "hclust") -corrplot(gapcor, method = "circle", col = col.cor, order = "hclust") - -### utilisons des palettes pr?d?finies -library(RColorBrewer) # tr?s pratique, on l'utilisera intensivement dans la partie ggplot ! -corrplot(gapcor, method = "ellipse", order = "hclust", col = brewer.pal(n = 8, name = "RdBu"), bg = "#438787") -corrplot(gapcor, method = "ellipse", order = "hclust", - col = brewer.pal(n = 8, name = "PuOr"), bg = "#438787", tl.col="black") -### on peut personnaliser fortement l'affichage: -corrplot(gapcor, method = "color", col = NULL, - type = "upper", order = "hclust", - addCoef.col = "black", # Ajout du coefficient de corr?lation - tl.col = "black", tl.srt = 45, #Rotation des etiquettes de textes - # Cacher les coefficients de corr?lation sur la diagonale - diag=FALSE -) # r?sultat int?ressant mais pas tr?s beau -corrplot(gapcor, method = "ellipse", order = "hclust", tl.srt = 45, - col = brewer.pal(n = 11, name = "PuOr"), bg = "#438787", tl.col="black", - title = "Corr?lations des donn?es ONU") -# on peut par contre faire varier l'ordre du trac? des corr?lations. -# m?thode d'?cart angulaire aux valeurs propres: -corrplot(gapcor, method = "ellipse", order = "AOE", tl.srt = 45, - col = brewer.pal(n = 11, name = "PuOr"), bg = "#438787", tl.col="black", - title = "Corr?lations des donn?es quantitatives ONU") # remarquez l'agencement diff?rent des corr?lations ! -# classement par coordonn?es sur la premi?re composante principale: -corrplot(gapcor, method = "ellipse", order = "FPC", tl.srt = 45, - col = brewer.pal(n = 11, name = "PuOr"), bg = "#438787", tl.col="black", - title = "Corr?lations des donn?es quantitatives ONU") # remarquez l'agencement diff?rent des corr?lations ! - -### on peut aussi varier la m?thode de classification dans hclust: -corrplot(gapcor, method = "ellipse", order = "hclust", hclust.method = "complete", - tl.srt = 45, col = brewer.pal(n = 11, name = "PuOr"), - bg = "#438787", tl.col="black", - title = "Corr?lations des donn?es ONU, r?ordonn?es par CAHI en lien complet") - -# lien simple -corrplot(gapcor, method = "ellipse", order = "hclust", hclust.method = "single", - col = brewer.pal(n = 11, name = "PuOr"), bg = "#438787", - tl.col = "black", tl.cex = 0.8, tl.srt = 45, - title = "Corr?lations des donn?es ONU, r?ordonn?es par CAHI en lien simple") - -# lien moyen -corrplot(gapcor, method = "ellipse", order = "hclust", hclust.method = "average", - tl.srt = 45, col = brewer.pal(n = 11, name = "PuOr"), - bg = "#438787", tl.col = "black", tl.cex = 0.8, - title = "Corr?lations des donn?es ONU, r?ordonn?es par CAHI en lien moyen", - line = -2) - -# lien centroid -corrplot(gapcor, method = "ellipse", order = "hclust", hclust.method = "centroid", - tl.srt = 45, col = brewer.pal(n = 11, name = "PuOr"), - bg = "#438787", tl.col="black", tl.cex = 0.8, - title = "Corr?lations des donn?es ONU, r?ordonn?es par CAHI centro?de", - line = -2) - -# lien m?dian -corrplot(gapcor, method = "ellipse", order = "hclust", hclust.method = "median", - tl.srt = 45, col = brewer.pal(n = 11, name = "PuOr"), - bg = "#438787", tl.col="black", tl.cex = 0.8, - title = "Corr?lations des donn?es ONU, r?ordonn?es par CAHI m?dian", - line = -2) - -# ward -corrplot(gapcor, method = "ellipse", order = "hclust", hclust.method = "ward", - tl.srt = 45, col = brewer.pal(n = 11, name = "PuOr"), - bg = "#438787", tl.col="black", tl.cex = 0.8, - title = "Corr?lations des donn?es ONU, r?ordonn?es par CAHI en distance de ward", line = -2) -# ward.d -corrplot(gapcor, method = "ellipse", order = "hclust", hclust.method = "ward.D", - tl.srt = 45, col = brewer.pal(n = 11, name = "PuOr"), - bg = "#438787", tl.col="black", tl.cex = 0.9, - title = "Corr?lations des donn?es ONU, r?ordonn?es par CAHI en distance de ward.D", line = -2) - -# ward.d2 -corrplot(gapcor, method = "ellipse", order = "hclust", hclust.method = "ward.D2", - tl.srt = 45, col = brewer.pal(n = 11, name = "PuOr"), - bg = "#438787", tl.col="black", tl.cex = 0.9, - title = "Corr?lations des donn?es ONU, r?ordonn?es par CAHI en distance de ward.D2", line = -2) - -#mcquitty -corrplot(gapcor, method = "ellipse", order = "hclust", hclust.method = "mcquitty", - tl.srt = 45, col = brewer.pal(n = 11, name = "PuOr"), - bg = "#438787", tl.col="black", tl.cex = 0.9, - title = "Corr?lations des donn?es ONU, r?ordonn?es par CAHI en distance de MacQuitty", line = -2) - -#mcquitty rect.col = 2 ou 6 ou 5 -corrplot(gapcor, method = "ellipse", order = "hclust", hclust.method = "mcquitty", addrect = 3, - tl.srt = 45, col = brewer.pal(n = 11, name = "PuOr"), rect.col = 2, rect.lwd = 2, - bg = "#438787", tl.col="black", tl.cex = 0.9, - title = "Corr?lations des donn?es ONU, r?ordonn?es par CAHI en distance de MacQuitty", line = -2) -### il existe une version mixte: -corrplot.mixed(gapcor) # plus limit?e et autres options - - -### ajouter: exercices == faire de m?me sur les matrices de corr?lations de rangs et comparer ! -### d?cision ! - - - -### Commencer en GGplot ---- -# installer ggthemes: -install.packages("ggthemes") - -(.packages()) -### les fondamentaux de ggplot sur les donn?es gapmind_2007_19 -# https://www.datanovia.com/en/fr/lessons/introduction-a-ggplot2/ -# -# appliquer les esth?tiques aux variables: -# boxplot: en x OU y - -ggplot(gapmind.2007.19, - aes(y = GDP_GUSDPPP_2017)) + - geom_boxplot() - - -ggplot(gapmind.2007.19, - aes(y = GDI_2019)) + - geom_boxplot() - -ggplot(gapmind.2007.19, - aes(x = GDP_GUSDPPP_2017)) + - geom_boxplot() - -ggplot(gapmind.2007.19, aes(x = GDI_2019)) + - geom_boxplot() - -### on peut afficher les points sur un boxplot en cr?ant un facteur fictif: -ggplot(gapmind.2007.19, - aes(x = factor(1), - y = GDI_2019)) + - geom_boxplot(width = 0.5) + - geom_jitter(width = 0.1) # jitter = d?placer les points l?g?rement de 10 % - -### nuage de points: -ggplot(gapmind.2007.19, - aes(x = GDP_GUSDPPP_2017, - y = GDI_2019)) + - geom_point() -## on peut utiliser des fonctions sur des variables dans l'esth?tique: -ggplot(gapmind.2007.19, - aes(x = log(GDP_GUSDPPP_2017), - y = GDI_2019)) + - geom_point() - -ggplot(gapmind.2007.19, - aes(x = log(GDP_GUSDPPP_2017), - y = Gender_Inequality_2019)) + - geom_point() - -ggplot(gapmind.2007.19, - aes(x = log(GNI_2019), - y = Gender_Inequality_2019)) + - geom_point() + - geom_smooth() - -### noter la diff?rence de position de l'esth?tique dans les commandes: -# Utilisez ceci -attach(gapmind.2007.19) # attacher le tibble nomm? aux commandes -detach(gapmind.2007.19) # d?tacher le tibble nomm? aux commandes -ggplot(gapmind.2007.19, - aes(log(gdpPercap), urban_pop_2019)) + - geom_point() + - geom_smooth() - -# ou ceci -ggplot(gapmind.2007.19) + - geom_point(aes(log(gdpPercap), urban_pop_2019)) - -## diff?rence entre couleur et remplissage: -# Couleur -ggplot(gapmind.2007.19, aes(GDI_2019, HDI_Class)) + - geom_boxplot(aes(color = HDI_Class)) -class(gapmind.2007.19$HDI_Class) - -# Remplir -ggplot(gapmind.2007.19, aes(HDI_Class, GDI_2019)) + - geom_boxplot(aes(fill = HDI_Class)) -# on a juste un petit probl?me de chevauchement des ?tiquettes d'axes. -ggplot(gapmind.2007.19, aes(HDI_Class, GDI_2019)) + - geom_boxplot(aes(fill = HDI_Class)) + - theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)) -# notez comment il vous avertis de l'?viction des NA. -# On pourrait gagner un peu de place dans l'espace de tra?age en changeant l'angle: - -# on peut affecter un objet: -boxplot_hdi_class <- ggplot(gapmind.2007.19, - aes(HDI_Class, GDI_2019)) + - geom_boxplot(aes(fill = HDI_Class)) + - labs(title = "Indicateur d'inégalité de genre selon l'HDI", - subtitle = "HDI = indicateur synthétique de développement humain ONU", - caption = "Source: ONU", - x = "Niveau HDI", - y = "Indicateur d'inégalités genré (2019)") + - theme(axis.text.x = element_text(angle = 45, vjust = 0.5, hjust = 0.5)) -(boxplot_hdi_class) -##sauvegarder l'objet ggplot: -ggsave("boxplot_hdi_class.png", device = "png") -#rm(xplot_hdi_class) - -# il faut afficher l'objet: -boxplot_hdi_class # l'objet peut ?tre modifi?, puis enregistr? etc... -str(boxplot_hdi_class) # noter la liste de param?tres ajustables ! -class(boxplot_hdi_class) -mode(boxplot_hdi_class) - - -### changer theme -#https://ggplot2.tidyverse.org/reference/ -theme_set(theme_grey()) - -boxplot_hdi_class_wrap <- ggplot(gapmind.2007.19, - aes(HDI_Class, GDI_2019)) + - geom_boxplot(aes(fill = HDI_Class)) + - facet_wrap(vars(continent)) + - labs(title = "Indicateur d'inégalité de genre selon l'HDI", - subtitle = "HDI = indicateur synthétique de développement humain ONU", - caption = "Source: ONU", - x = "Niveau HDI", - y = "Indicateur d'inégalités genré (2019)") + - theme(axis.text.x = element_text(angle = 45, vjust = 0.5, hjust = 0.5)) -(boxplot_hdi_class_wrap) - - - From 21786f8ba99bf5fd945072fa027168a8d1cf931e Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:26:10 +0200 Subject: [PATCH 12/25] Create README.md A readme presenting the R seminar session. --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..94bcf36 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +Voici les documents quarto, codes et fichiers associés à la séance du séminaire R de la Cité du développement durable du 9 octobre 2025. + +Le séminaire R de la Cité du Déeloppement Durable est un séminaire ouvert à toutes les personnes intéressées et organisé au Cired. + +contact : franck.nadaud@cnrs.fr + +Here are the quarto, codes and files for the 9th october 2025 session of the R seminar of Cité du Développement Durable + +The R seminar is open to all interested persons with R and organized at Cired + +contact : franck.nadaud@cnrs.fr From 8e8e81781fb2aa0d79806ddb38635c9725fda84f Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 11:45:02 +0200 Subject: [PATCH 13/25] fichier session du 9-10-2025 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fichier principal de la session initiale du séminaire R sur les tests statistiques sous R. This is the main file of the seminar session on statistical tests under R. --- bricoleR_2025.6_tests_statistiques.qmd | 537 +++++++++++++++++++++++++ 1 file changed, 537 insertions(+) create mode 100644 bricoleR_2025.6_tests_statistiques.qmd diff --git a/bricoleR_2025.6_tests_statistiques.qmd b/bricoleR_2025.6_tests_statistiques.qmd new file mode 100644 index 0000000..fbd994a --- /dev/null +++ b/bricoleR_2025.6_tests_statistiques.qmd @@ -0,0 +1,537 @@ +--- +title: "Bricole'R 2025.6 tests sous R" +author: "Francky" +html_document: + code_folding: hide + theme: readable + highlight: zenburn + toc: true + toc_depth: 2 + numbered_section: true + fig_width: 13 + fig_height: 8 + fig_caption: true + df_print: paged +editor: visual +--- + +## Introduction + +Ce document quarto regroupe les tests dans R à partir de la formation des 22 au 24 septembre 2025. + +**Avertissement** : + +Les niveaux de R étaient très hétérogènes lors de cette formation qui s'est plutôt axée sur la théorie et la pratique dans divers environnements essentiellement jasp, excel et finalement R. + +Par contre, le supports powerpoint de la formation sont pratiquement tous en R et complètent les fichiers excel divers associés. Le support de cours est très riche : il fait presque 300 pages. + +## Test de Student + +On s'attaque ici au test de student. + +t-test : il existe deux protocoles : + +- données indépendantes == pas les mêmes individus + +- données appariées == mêmes individus appariés + +Deux scénarios très différents ! + +- En données indépendantes :==\> on s'intéresse à la **différences des moyenne**! + +- En données appariées ==\> on s'intéresse on à la **moyenne des différences** + +**Par défaut il ne faut pas préciser en données indépendantes**. + +exemple dans xl sur données 2 materiaux.xlsx : fonction t.test 1 = observations pairées (appariées : erreur de traduction microsoft !). + +Package esquisse : + +[esquisse](https://dreamrs.github.io/esquisse/) + +Un wrapper de ggplot avec interface graphique et récupération du code pour script / quarto + +[glossaire ISI](https://isi-web.org/glossary/1355) paramètre de localisation == différence des moyennes ! + +JASP calcule l'intervalle de confiance de la différence des moyennes ! + +[site jasp](https://jasp-stats.org/thank-you-for-downloading-jasp-win64/) + +[extension graphpad dans R](https://csdaw.github.io/ggprism/) + +### test de Student simple + +```{r, test de student avec collage} +Data2M <- coller() # avec coller +str(Data2M) # il les colle en caractères ! +Data2M$INOX <- as.numeric(Data2M$INOX) +Data2M$ALU <- as.numeric(Data2M$ALU) +summary(Data2M) +# test de student ALU et INOX : différence des moyennes +t.test(Data2M$INOX, Data2M$ALU) +# Notez que R fait automatiquement la correction de Welsh +t.test(Data2M$INOX, Data2M$ALU, var.equal = TRUE) +# test T en données appariées : moyennes des différences +t.test(Data2M$INOX, Data2M$ALU, var.equal = TRUE, paired = TRUE) +test_t <- t.test(Data2M$INOX, Data2M$ALU, var.equal = TRUE, paired = TRUE) +(test_t) +class(test_t) +str(test_t) +attributes(test_t) <- "test machine 1" +``` + +Faisons le test en important les données et en testant une variété d'options. + +La commande t.test est très riche car elle créée une liste de résultats exploitables par la suite. + +```{r, test de Student avec import et options} +Data2M <- readRDS("Data2M.rds") # importation d'un rds +str(Data2M) # cette fois c'est du numérique +summary(Data2M) # on a donc deux variables numériques INOX et ALU + +# Créons un objet t-test : +resist.na <- t.test(Data2M) # na pour non apparié +(resist.na) +str(resist.na) +# qu'est-ce qu'il a fait ? La moyenne de l'ensemble des données ! + +## On peut tester sur la moyenne d'une ou deux variables. + +## test univarié : on teste l'égalité à une valeur sur ALU +# on peut tester l'égalité à une moyenne sur une valeur connue pour une variable +resist.alu <- t.test(Data2M$ALU) # valeurs par défaut +(resist.alu) +# par défaut il teste la positivité d'une moyenne : xbar > 0 + +# on peut tester l'égalité à une valeur de référence : tolérance, norme, population... +resist.alu <- t.test(Data2M$ALU, + mu = 65, + alternative = "less", + conf.level = 0.99) +(resist.alu) # moyenne < 65 + +resist.alu <- t.test(Data2M$ALU, + mu = 65, + alternative = "greater", + conf.level = 0.99) +(resist.alu) # moyenne > 65 + +resist.alu <- t.test(Data2M$ALU, + mu = 65, + conf.level = 0.99) +(resist.alu) # moyenne centrée sur 65 + + +# tests sur deux variables : moyenne INOX = ALU +resist.na <- t.test(Data2M$INOX, Data2M$ALU) +(resist.na) + +# on pourrait tester plus strictrement : 99% +resist.na <- t.test(Data2M$INOX, Data2M$ALU, conf.level = 0.99) +str(resist.na) +class(resist.na) +(resist.na) + +# test de moyenne INOX < ALU +resist.na <- t.test(Data2M$INOX, Data2M$ALU, + alternative = "less", conf.level = 0.99) +(resist.na) + +# test de moyenne INOX > ALU +resist.na <- t.test(Data2M$INOX, Data2M$ALU, + alternative = "greater", conf.level = 0.99) +(resist.na) + + +# On peut tester inférieure à une valeur de référence : mu = 65 +resist.na <- t.test(Data2M$INOX, Data2M$ALU, + mu = 65, + alternative = "less", + conf.level = 0.99) +(resist.na) + + +# on pourrait aussi tester de manière appariée +resist.ap <- t.test(Data2M$INOX, Data2M$ALU, paired = TRUE) # ap : apparié +(resist.ap) + +resist.ap <- t.test(Data2M$INOX, Data2M$ALU, + paired = TRUE, + conf.level = 0.99) # ap : apparié +(resist.ap) +``` + +### Le paquetage Rstatix + +On peut aussi faire appel au paquetage rstatix : + +```{r, avec rstatix} +library(rstatix) +DM <- readRDS("DM.rds") +summary(DM) +# utiliser t_test de rstatix +t_test(DM, Y ~ Materiau) +DM %>% t_test(Y ~ Materiau) +# transformons Materiau en facteur : +library(tidyverse) +DM <- mutate_if(DM, is.character, as.factor) # le plus radical +DM$Materiau <- as.factor(DM$Materiau) # voie base R +summary(DM) +tests_materiaux <- t_test(DM, Y ~ Materiau) +View(tests_materiaux) +# les teste toutes les combinaisons de tests sur le facteur Materiau + +# On peut fixer les comparaisons, +tests_materiaux <- t_test(DM, Y ~ Materiau, + comparisons = list(c("Aluminium", "Inox"), + c("Acier", "Cuivre"))) +View(tests_materiaux) +# On peut définir un groupe de référence : +tests_materiaux <- t_test(DM, Y ~ Materiau, ref.group = "Acier") +View(tests_materiaux) # Il compare Acier aux autres métaux + +# corrections multiples = comme on fait des comparaisons multiples il faut corriger la pvalue +tests_materiaux <- t_test(DM, Y ~ Materiau, p.adjust.method = "bonferroni") +View(tests_materiaux) # avec la correction de Bonferroni == alpha / Nb tests + +tests_materiaux_fdr <- t_test(DM, Y ~ Materiau, p.adjust.method = "fdr") +View(tests_materiaux_fdr) # avec la correction de Bonferroni == alpha / Nb tests + +tests_materiaux_fdr <- t_test(DM, Y ~ Materiau, + p.adjust.method = "fdr", + detailed = TRUE) # avec résultats complets +View(tests_materiaux) +``` + +Rstatix gère les configurations sans problème au contraire de t.test qui lui n'admet que des facteurs à deux modalités. Pour plus de deux modalités il faut passer en analyse de variance en base R. + +```{r, test t avec comparaison colonnes} +resist <- coller() +summary(resist) +resist$Metal <- as.factor(resist$Metal) +resist$Resistance <- as.numeric(resist$Resistance) +summary(resist) +t.test(data = resist, Resistance ~ Metal) # bien préciser les options +# on retrouve les valeurs vues plus haut, à vous de jouer sur les options ! +``` + +On test l'analyse de variance à un facteur + +```{r, anova à un facteur} +# readRDS("DM.rds") +# on emploie ici la méthode anova directement sur les données +ModeleAnova1 <- aov (data = DM, Y ~ Materiau) +ResumeAnova1 <- summary (ModeleAnova1) +plot(ModeleAnova1, 1:6) +summary(ModeleAnova1) +names (ModeleAnova1) # accès aux objets de l'Anova +(ResumeAnova1) +ResumeAnova1 [[1]] [5] # accès à la p-value +ModeleAnova1 $ residuals # accès aux résidus +shapiro.test ( ModeleAnova1 $ residuals ) # Normalité des résidus +plot(ModeleAnova1 $ residuals) +(ModeleAnova1$fitted.values) +(ModeleAnova1$residuals) +plot(ModeleAnova1,1:6) + +TukeyHSD (ModeleAnova1) # Test de Tukey Post Hoc de base sur modèle aov +plot(TukeyHSD(ModeleAnova1, "Materiau")) # graphe des intervalles de confiance +print(TukeyHSD(ModeleAnova1)) # méthode print spécifique + +# Tests de Tukey avancé +# Nécessite la library (multcomp) et variable facteur en Factor +library (multcomp) +res.lm = lm (data = DM, Y ~ Materiau) +summary(res.lm) +T.Tukey = glht (ModeleAnova1, linfct = mcp ( Materiau = "Tukey" )) +summary (T.Tukey) +cld (T.Tukey) # Formation des groups de modalités avec lettres (a,b,c,…) +plot (T.Tukey) # Graphes des IC des differences des moyennes + +``` + +Un guide conçis sur l'utilisation de aov() et anova() dans R : + +[guide anova](https://www.geeksforgeeks.org/r-language/when-to-use-aov-vs-anova-in-r/) + +[un chapitre sur l'anova](https://bookdown.org/steve_midway/DAR/understanding-anova-in-r.html) + +En résumé : aov() pour tester les données, anova() pour tester des modèles lm(), glm()... + +Le paquetage multcomp : + +[paquetage multcomp](https://cran.r-project.org/web/packages/multcomp/refman/multcomp.html) + +Comparaison multiples dans des contextes de modèles linéaires. + +## Le test du khi² + +La commande `chisq.test` attend des vecteurs sous forme de facteurs croisés dont elle compte les occurances par croisements de modalités. + +C'est un test d'indépendance par comptage de croisements de modalités. + +On peut par contre importer directement une table de contingence selon divers formats mais avec quelques remarques. + +#### cas 1 : tableau de données de classe table + +On utilise la commande `table` ou `as.table` pour créer un tableau R dont on précise les en-têtes avec la commande `dimnames`, comme dans l'aide de `chisq.test`. + +#### cas 2 : + +On importe une table de contingence en format large. Dans les options d'importation XL il faut préciser `rowNames = TRUE et colNames = TRUE.` + +#### cas 3 : + +Une liste de deux vecteurs avec les modalités répétées autant de fois au croisements. La commande va reconstruire par comptage la table de contingence à partir des modalités rencontrées des facteurs. + +#### cas 4 : + +On importe une table en format long et on la déploie avec pivot_wider ou spread ou un équivalent. + +```{r, test du khi 2 avec diverses données} +### Cas 1 : tableau de données de classe table +require(tidyverse) +Maladies <- as.table(rbind(c(28, 9, 29, 5), + c(73, 12, 25, 9), + c(29, 18, 13, 5), + c(50, 14, 20, 8))) +dimnames(Maladies) <- list( + Maladie = c("Rougeole", "Varicelle", "Grippe", "Scarlatine"), + Région = c("Languedoc", "Alsace", "Auvergne", "Bretagne")) +str(Maladies) +(Maladies) +class(Maladies) +# test du khi² sur le tableau construit +chisq.test(Maladies) + +# Cas 2: importation d'un fichier excel en format long +DataMaladies <- read.xlsx("Maladies_Régions.xlsx", "long", colNames = TRUE) +head(DataMaladies) +str(DataMaladies) +summary(DataMaladies) +class(DataMaladies) +# mais régions et maladies sont en caractère +DataMaladies <- mutate_if(DataMaladies, is.character, as.factor) +summary(DataMaladies) +chisq.test(DataMaladies$Région, DataMaladies$Maladie) + +# Cas 3 : importation d'un fichier excel en format large +DataMaladies <- read.xlsx("Maladies_Régions.xlsx", + colNames = TRUE, + rowNames = TRUE) +(DataMaladies) +str(DataMaladies) +chisq.test(DataMaladies) +# En fait il faut déclarer rowNames = TRUE + +``` + +### complément du khi² : l'analyse factorielle des correspondances + +```{r, complement AFC} +require(Factoshiny) +require(FactoMineR) +load("DataTitanic") + +table(DataTitanic$Classe, DataTitanic$Survie) +chisq.test(DataTitanic$Classe, DataTitanic$Survie) +DataTitanic $ Survie = + as.factor (DataTitanic $ Survie) +DataTitanic <- mutate_if(DataTitanic, is.character, as.factor) +summary(DataTitanic) +survie_age <- table(DataTitanic$Survie, DataTitanic$Age) +chisq.test(survie_age) +survie_sexe <- table(DataTitanic$Survie, DataTitanic$Sexe) +chisq.test(survie_sexe) +survie_embarq <- table(DataTitanic$Survie, DataTitanic$Embarq) +chisq.test(survie_embarq) +# realisation de l'AFC +(survie_age) +class(survie_age) +mode(survie_age) +(survie_age_df <- as.data.frame(survie_age)) +class(survie_age_df) +class(children) # nuance : la première colonne est rownames +# il faut donc convertir en rownames la colonne Var1 de survie_age + + +survie_age_afc <- as.data.frame(survie_age) +survie_age_afc <- pivot_wider(survie_age_afc, names_from = Var2, values_from = Freq) +(survie_age_afc) +rownames(survie_age_afc) <- survie_age_afc[,1] # ça ne marche plus ! +# mais comme cela ça marche : +survie_age_afc <- survie_age_afc %>% + remove_rownames %>% + column_to_rownames(var="Var1") +# on ne peut plus le forcer = plus de risque de le faire accidentellement ! +afc_titanic_age <- CA(survie_age_afc) +summary(afc_titanic_age) + +# Lancement du modèle +ModeleRegLog1 = glm (data = DataTitanic, family = "binomial", Survie ~. , ) +library(car) +Anova (ModeleRegLog1) # library car +# Accès aux infos du modèle +ModeleRegLog1 $ null.deviance +ModeleRegLog1 $ deviance +ModeleRegLog1 $ coefficients +# Accès aux coefficients par la fonction tbl_regression du package gtsummary +library ( gtsummary ) +tbl_regression ( ModeleRegLog1 ) +tbl_regression ( ModeleRegLog1, exponentiate = TRUE) + +# avec interactions : +ModeleRegLog2 = glm (data = DataTitanic, family = "binomial", Survie ~ Sexe * Classe , ) +library(car) +Anova (ModeleRegLog2) # library car +# Accès aux infos du modèle +ModeleRegLog2 $ null.deviance +ModeleRegLog2 $ deviance +ModeleRegLog2 $ coefficients +# Accès aux coefficients par la fonction tbl_regression du package gtsummary +library ( gtsummary ) +tbl_regression ( ModeleRegLog2 ) +tbl_regression ( ModeleRegLog2, exponentiate = TRUE) + + + +``` + +Pour Quarto voir : . + +## Tests avec fonctions ie() + +```{r, fonction ie avec choix fichier oar filechoose} + +ie() # fonction ouvrant une fenêtre explorateur pour choisir le fichier +# sélectionnez le fichier Data xl Data Sante.xlsx + +DS <- ie() +summary(DS) +# testons de comparaison à une valeur de l'âge moyen à 40 ans : +t.test(x = DS$AGE, mu = 40) +``` + +```{r, Mann-Whitney} + +# comparer deux médianes +fg <- coller() +# on ne peut pas faire de test t classique ! On a pas de choix ! +glimpse(fg) +summary(fg) +t.test(fg$F, fg$G) +plot(fg$F,fg$G) +shapiro.test(fg$F) +shapiro.test(fg$G) + +# Test de Mann Whitney +wilcox.test(fg$F,fg$G) +plot(log(fg$F), log(fg$G)) +``` + +### paquetage nortest + +[nortest](https://www.normalesup.org/~carpenti/Notes/Normalite/Dago-test.html) + +```{r} +pt(2, 48, lower.tail = TRUE, log.p = FALSE) +``` + +\[distribution t dans R\]() + +==\> trouver la formule probabilité qu'un classement à n individus soit classés séparément sur deux variables == \> pour tests non paramétriques ! + +### calculs de puissances avec pwrss + +[paquetage pwrss](https://cran.r-project.org/web/packages/pwrss/vignettes/examples.html) + +```{r, puissance} +library(pwrss) +model <- lm(mpg ~ hp + wt, data = mtcars) +summary(model) +power.t.test(ncp = -3.519, # t-value for hp variable + df = 29, # residual degrees of freedom + alpha = 0.05, # type 1 error rate + alternative = "two.sided", + plot = TRUE) + +apropos("power") +stats::power.t.test(n = 15, delta = 10, sd = 15.0, sig.level = 0.05) + +# revenons à notre test initial : +t.test(Data2M$INOX, Data2M$ALU) +power.t.test(ncp = -3.0451, # t-value for hp variable + df = 20, # residual degrees of freedom + alpha = 0.05, # type 1 error rate + alternative = "two.sided", + plot = TRUE) + +# on peut rajouter les autres cas envisagés : +t.test(Data2M$INOX, Data2M$ALU, var.equal = TRUE) +power.t.test(ncp = -3.0451, # t-value for hp variable + df = 26, # residual degrees of freedom + alpha = 0.05, # type 1 error rate + alternative = "two.sided", + plot = TRUE) +# test T en données appariées : moyennes des différences +t.test(Data2M$INOX, Data2M$ALU, var.equal = TRUE, paired = TRUE) +power.t.test(ncp = -3.5129, # t-value for variable + df = 13, # residual degrees of freedom + alpha = 0.05, # type 1 error rate + alternative = "two.sided", + plot = TRUE) +## notez que le paramètre type = est refusé par la fonction... + +``` + +**Attention avec power.t.test() de stats !** Il est masqué par pwrss ! + +## Utilisation de GPower + +**Tres très utile pour vérifier la théorie et évaluer les puissances très vite** + +## Test de Fischer sur régression + +```{r, test de Fischer sur régression linéaire} +temperature <- ie() +summary(temperature) +# on explique la température par le temps ! +mod_1 <- lm(Temp.Moyenne ~ Année, data = temperature) +summary(mod_1) +power.f.test(ncp = 1, df1 = 1, df2 = 74, alpha = 0.05) +power.f.test(ncp = 63, df1 = 1, df2 = 74, alpha = 0.05) +## essayons de voir sur l'anomalie de température : +norm_temp <- mean(temperature$Temp.Moyenne[46:76]) +temperature <- mutate(temperature, anomalie = Temp.Moyenne - norm_temp) +summary(temperature) +smooth <- loess(temperature$anomalie ~ temperature$Année) +plot(temperature$Année, temperature$anomalie) +lines(predict(smooth), col = 'red', lwd = 2) +require(tidyverse) +ggplot(temperature, + aes(temperature$Année, temperature$anomalie)) + + geom_point() + + geom_smooth() +``` + +## tests sur proportions + +comparaison d'une proportion à une valeur donnée : + +```{r, test sur proportion} +binom.test(n = 150, x = 100, p = 0.50) +binom.test(n = 150, x = 85, p = 0.50) +binom.test(n = 150, x = 95, p = 0.50) ### sondage présidentielles binom.test(n = 30000, x = 14700, p = 0.50) +power.binom.test(size = 150, 0.5, alpha = 0.05, null.prob = 0.5, alternative = "two.sided") +``` + +### comparaison de deux proportions : + +```{r, comparaison de deux proportions} +prop.test(c(60,24), c(200,160)) +power.z.twoprops(prob1 = 0.30, prob2 = 0.15, + power = 0.90, arcsine = TRUE) +probs.to.h(prob1 = 0.30, prob2 = 0.15) +``` + + From 5f6f0bb36852736ade0983bdd77799e1d2afe5b5 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 11:51:59 +0200 Subject: [PATCH 14/25] Create data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit création du dossier données --- data | 1 + 1 file changed, 1 insertion(+) create mode 100644 data diff --git a/data b/data new file mode 100644 index 0000000..8bfcc76 --- /dev/null +++ b/data @@ -0,0 +1 @@ +fichiers de données -- data files From dd5ce0ecb44685c5568e643ae21534f97bd7052b Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 11:53:47 +0200 Subject: [PATCH 15/25] Create references --- references | 1 + 1 file changed, 1 insertion(+) create mode 100644 references diff --git a/references b/references new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/references @@ -0,0 +1 @@ + From 007adb9a0bd062e1214898cd547b83fce9d53f4c Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 12:00:00 +0200 Subject: [PATCH 16/25] Delete data --- data | 1 - 1 file changed, 1 deletion(-) delete mode 100644 data diff --git a/data b/data deleted file mode 100644 index 8bfcc76..0000000 --- a/data +++ /dev/null @@ -1 +0,0 @@ -fichiers de données -- data files From 2ccece4c41b5062e0bac41614630c8cdacbbf377 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 12:00:11 +0200 Subject: [PATCH 17/25] Delete references --- references | 1 - 1 file changed, 1 deletion(-) delete mode 100644 references diff --git a/references b/references deleted file mode 100644 index 8b13789..0000000 --- a/references +++ /dev/null @@ -1 +0,0 @@ - From ade5ffbe5892c9c486f3bd5eaaa7caceeb88779a Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 12:05:23 +0200 Subject: [PATCH 18/25] Create __donnees MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fichiers de données / data files --- data/__donnees | 1 + 1 file changed, 1 insertion(+) create mode 100644 data/__donnees diff --git a/data/__donnees b/data/__donnees new file mode 100644 index 0000000..2db35e1 --- /dev/null +++ b/data/__donnees @@ -0,0 +1 @@ +fichiers de données From a80a14bcc77efeaa7adb3607cd83170da657826a Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 12:07:50 +0200 Subject: [PATCH 19/25] Create references References --- references | 1 + 1 file changed, 1 insertion(+) create mode 100644 references diff --git a/references b/references new file mode 100644 index 0000000..ca665cf --- /dev/null +++ b/references @@ -0,0 +1 @@ +References From 6dc9af24f65f803ad9776f158e925ae0e01f0bc3 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 12:08:11 +0200 Subject: [PATCH 20/25] Delete references --- references | 1 - 1 file changed, 1 deletion(-) delete mode 100644 references diff --git a/references b/references deleted file mode 100644 index ca665cf..0000000 --- a/references +++ /dev/null @@ -1 +0,0 @@ -References From 1585064b28792dffd74f487a3d372bde6e0bf41b Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 12:09:16 +0200 Subject: [PATCH 21/25] Create references --- references/references | 1 + 1 file changed, 1 insertion(+) create mode 100644 references/references diff --git a/references/references b/references/references new file mode 100644 index 0000000..abd5e95 --- /dev/null +++ b/references/references @@ -0,0 +1 @@ +this directory of references From 9296059c9b584ae236b3d93802b37ebbd29adc20 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 14:17:28 +0200 Subject: [PATCH 22/25] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fichiers utilisés dans la session tests statistiques sous R. --- "data/2 mat\303\251riaux.xlsx" | Bin 0 -> 11155 bytes data/DM | Bin 0 -> 265 bytes data/DM.rds | Bin 0 -> 250 bytes data/Data Sante.xlsx | Bin 0 -> 17405 bytes data/Data2M.rds | Bin 0 -> 236 bytes data/DataTitanic | Bin 0 -> 2419 bytes data/TCMaladie | Bin 0 -> 251 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 "data/2 mat\303\251riaux.xlsx" create mode 100644 data/DM create mode 100644 data/DM.rds create mode 100644 data/Data Sante.xlsx create mode 100644 data/Data2M.rds create mode 100644 data/DataTitanic create mode 100644 data/TCMaladie diff --git "a/data/2 mat\303\251riaux.xlsx" "b/data/2 mat\303\251riaux.xlsx" new file mode 100644 index 0000000000000000000000000000000000000000..d2452c963ce5b7cf6bdb491527c5085cbd66558c GIT binary patch literal 11155 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 OIzSfY>RgOJpZ*`K&N7=R)`4kH5# z11FGXa`6SK5(cq=SOADMpfaqE$(gA|1IgiZ%qh*y%*!mz9qa-uo_YBd1Hfi;F3l_} zN*!Px0|PHO-7qkG0OC(T{04~M1Mznteh0)Kf%peh>?;sI0OChLd>4q{0`Ywyz6Zq5 zp!^p=d;`jV3|0FaD*g#-=5r{11;n4B=ECfF2NehDe+t#}1uf;X<|XE)7DE#~6I77H zH?btOC^NAX%4dv3*Oi=;SPatz6XZ%sEJ@T$D*_sbrkt}Vzg!Py5h#?H8i2(A|NlY0 P`v<}Rg9$CTtOEc5h?#35 literal 0 HcmV?d00001 diff --git a/data/DM.rds b/data/DM.rds new file mode 100644 index 0000000000000000000000000000000000000000..33e97d4b9708fad01edafd69d690427f1a830694 GIT binary patch literal 250 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 literal 0 HcmV?d00001 diff --git a/data/Data2M.rds b/data/Data2M.rds new file mode 100644 index 0000000000000000000000000000000000000000..17164f5a93d6acdf06522dcd82aa5cd43e511831 GIT binary patch literal 236 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 Qo}BO~SA;$AM6k2{1E2KA;{X5v literal 0 HcmV?d00001 diff --git a/data/TCMaladie b/data/TCMaladie new file mode 100644 index 0000000000000000000000000000000000000000..f73c855864cb440b2dee14b3a1e7328b683ac32a GIT binary patch literal 251 zcmVEjS_y>(w_?$cvBdRNQ;PN<>-=lY>C7n3H!XEt|Il_f_yy18P!h2L008h> Ba=QQk literal 0 HcmV?d00001 From 00851ed9301bc85a188cbe0520f43a503a6572cc Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 14:18:39 +0200 Subject: [PATCH 23/25] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fichier nécessaire pour executer les fonctions de la session. --- references/.rprofile | 69 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 references/.rprofile diff --git a/references/.rprofile b/references/.rprofile new file mode 100644 index 0000000..96f2b14 --- /dev/null +++ b/references/.rprofile @@ -0,0 +1,69 @@ +print ("Bonjour") + +# library (FactoMineR) +# library (car) +# library (doBy) +library (openxlsx) +library(rstatix) +# library (Factoshiny) + +####################################################### +# la fonction coller permet de faire une importation par +coller = function () +{ + read.table("clipboard", header=TRUE, sep="\t", dec = ",") +} +####################################################### +# permet d'importer de l'Excel +ie = function () +{ + read.xlsx( file.choose() ) +} + +####################################################### +# Extraction des colonnes numériques d'un dataframe +DfNum = function(DataFrameEntree) +{ + DataFrameSortie = DataFrameEntree [ sapply ( X = DataFrameEntree, is.numeric ) == TRUE] + return(DataFrameSortie) +} + +############################################################################################ +# Fonction qui effectue le test du Khi Deux des combinaisons des variables d'un dataframe +FKhiDeux = function (DataFrameEntree) +{ + # Récupère le nom du DataFrame passé en entrée + NomDataFrame = deparse(substitute(DataFrameEntree)) + + # Récupère les noms des colonnes du dataframe + DataFrameEntree = DfTexte(DataFrameEntree) + NomVariables = names (DataFrameEntree) + + # Crée un dataframe avec 2 colonnes contenant toutes ls combinaisons croisées des Noms des variables + DataFrameSortie = as.data.frame(t(combn(x=NomVariables, m = 2))) + + i = 1 + while (i<=nrow(DataFrameSortie)) + { + # Récupération de la p-value + PValueLocale = + chisq.test( + DataFrameEntree [,DataFrameSortie [i,1]], + DataFrameEntree [,DataFrameSortie [i,2]] + )$p.value + + # Stockage de la p-value du test du Khi ² + DataFrameSortie$PValueKhiDeux [i] = PValueLocale + i = i + 1 + } + + # Ajout de la colonne SIGnificatif ou pas (avec un alpha de 0.05) + + DataFrameSortie$Sig = ifelse(DataFrameSortie$PValueKhiDeux<0.05, "SIG", "NON SIG") + + # Retour du dataframe de synthèse + return (DataFrameSortie) +} +##################################################################################### + +print ("A Bientôt!!") From 32199d55cc4411db0ca53e54f3221bdefb114c82 Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 14:20:10 +0200 Subject: [PATCH 24/25] Add files via upload --- .rprofile | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 .rprofile diff --git a/.rprofile b/.rprofile new file mode 100644 index 0000000..96f2b14 --- /dev/null +++ b/.rprofile @@ -0,0 +1,69 @@ +print ("Bonjour") + +# library (FactoMineR) +# library (car) +# library (doBy) +library (openxlsx) +library(rstatix) +# library (Factoshiny) + +####################################################### +# la fonction coller permet de faire une importation par +coller = function () +{ + read.table("clipboard", header=TRUE, sep="\t", dec = ",") +} +####################################################### +# permet d'importer de l'Excel +ie = function () +{ + read.xlsx( file.choose() ) +} + +####################################################### +# Extraction des colonnes numériques d'un dataframe +DfNum = function(DataFrameEntree) +{ + DataFrameSortie = DataFrameEntree [ sapply ( X = DataFrameEntree, is.numeric ) == TRUE] + return(DataFrameSortie) +} + +############################################################################################ +# Fonction qui effectue le test du Khi Deux des combinaisons des variables d'un dataframe +FKhiDeux = function (DataFrameEntree) +{ + # Récupère le nom du DataFrame passé en entrée + NomDataFrame = deparse(substitute(DataFrameEntree)) + + # Récupère les noms des colonnes du dataframe + DataFrameEntree = DfTexte(DataFrameEntree) + NomVariables = names (DataFrameEntree) + + # Crée un dataframe avec 2 colonnes contenant toutes ls combinaisons croisées des Noms des variables + DataFrameSortie = as.data.frame(t(combn(x=NomVariables, m = 2))) + + i = 1 + while (i<=nrow(DataFrameSortie)) + { + # Récupération de la p-value + PValueLocale = + chisq.test( + DataFrameEntree [,DataFrameSortie [i,1]], + DataFrameEntree [,DataFrameSortie [i,2]] + )$p.value + + # Stockage de la p-value du test du Khi ² + DataFrameSortie$PValueKhiDeux [i] = PValueLocale + i = i + 1 + } + + # Ajout de la colonne SIGnificatif ou pas (avec un alpha de 0.05) + + DataFrameSortie$Sig = ifelse(DataFrameSortie$PValueKhiDeux<0.05, "SIG", "NON SIG") + + # Retour du dataframe de synthèse + return (DataFrameSortie) +} +##################################################################################### + +print ("A Bientôt!!") From bb4fb95da6de334f38894aa5be660108d980c93e Mon Sep 17 00:00:00 2001 From: The-illuminated-statistician <79142199+The-illuminated-statistician@users.noreply.github.com> Date: Fri, 10 Oct 2025 14:37:18 +0200 Subject: [PATCH 25/25] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fichier avec tous les résultats courants dans l'environnement R de la session. Useful to apply whole session R environment. --- .RData | Bin 0 -> 96314 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .RData diff --git a/.RData b/.RData new file mode 100644 index 0000000000000000000000000000000000000000..c8ef85fc877d363b449a3fc1ca8515f1accb7bb3 GIT binary patch literal 96314 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Ⓢ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�XE9R05tN2kgp32al$y2y;^V&d JGu8Wd{Tt&x#sB~S literal 0 HcmV?d00001