2024年10月

背景

大家应该都体会过广告的苦恼,比如看着好看的电视,突然给播放广告,这时候痛苦系数飙升。随着社会进步,广告的载体,还有形式也越来越多,比如手机端各种APP启动广告,PC端软件弹窗,网站Banner等,这些广告最主要的目的就是诱骗你误操作点击,然后陷入几乎无限弹窗的循环之中,甚至后台给你安装不需要的软件,还有中毒和被诈骗的风险。有幸见证中国互联网的崛起,但是也不幸命中过很多流氓软件的广告,让人印象深刻,下面先回顾那些让人深恶痛觉的流氓广告。

流氓广告行为

1、电脑安装软件捆绑广告弹窗

2、浏览器首页劫持,打开浏览器进入首页,广告全屏弹框

2345、hao123、360导航等首页劫持

3、视频网站广告,看个30秒视频,需要先看1分钟广告

4、DNS劫持,运营商广告,访问网站左右两边各种广告图,开个百度,整个网页都被强制跳转到XX娱乐城

5、手机APP启动页广告

6、百度搜索广告

致敬历史

下面列举一些自己用过的广告拦截神器(历史工具现已失效)

1、大家都知道360是流氓软件,但是在当时互联网兴起的时代,各种流氓软件太多了,反而适合用魔法打败魔法,用360虽然电脑变卡,或者偷偷走流量,或者被锁定主页,或者被他劫持dns,但是,但是,他可以帮你拦截广告弹窗,杀毒,电脑中毒后,还有系统急救箱,或者还能免费call到360工程师查看电脑问题,总的来说,功大于过,还蛮好用的,但是自从电脑越来越卡,彭有戏称,卸载了杀毒软件,电脑性能提高了30%。360弹窗拦截器是当时一款很好用的拦截神器,基本上解决了,电脑桌面右下角广告弹框,网页弹窗,屏幕中间弹窗这些问题。

2、ADsafe净网大师。这款是用过最好用的拦截工具,除了可以解决弹窗的问题,还可以杀掉浏览器访问网页的广告,甚至还可以看优酷等视频跳过广告,打开后,整个电脑上网冲浪几乎屏蔽了99%。但是后面因为一些原因(疑似劫持全局流量,非基于过滤规则,侵犯隐私下架了)

把握当下

以往不恋,来着可追。分享下我现在可用的广告拦截神器,全平台的工具,来自N年的积累。

一、PC浏览器

1、谷歌浏览器插件:Adblock

Adblock预设了一些广告拦截规则,然后可以自动获取到最新的规则,屏蔽网站对应广告区域的元素,如果没有被识别出广告,可以自己选择广告区域,进行元素拦截

2、谷歌浏览器插件:广告终结者

这个和Adblock类似,也是基于脚本规则进行拦截

3、谷歌浏览器:YouTube广告过滤

如果你想看看国外的视频,YouTube最为全球最大的视频网站你应该不会错过,但是他也有很多广告,这个插件可以成功拦截,给你省下时间

4、浏览器插件:油猴相关的工具

谷歌浏览器插件上架是需要费用的,于是有了油猴这种平台,在插件里可以安装脚本,只需要油猴向谷歌付费,油猴脚本不需要费用,自己也可以写脚本供浏览器使用。

这里我用到的有全网视频广告拦截,csdn广告过滤,大家可以自己搜一下这些油猴脚本

二、PC端电脑弹窗拦截

现在电脑上的软件比以前弹窗少了很多,因为大家安全意识比较强,也知道那些个流氓软件,基本上用一下可能就卸载了,所以也没有什么弹窗,但是也有一些弹窗至今还存在,比如说解压软件,解压缩包的时候就弹窗,如果你不知道怎么避免安装弹窗的软件,所以还是需要这种弹框拦截软件,进行统一拦截,也能清净许多。

三、手机端

1、专用DNS或专属DNS

手机可以设置专门去广告的dns,这种dns自动识别为广告的域名后,就直接过滤屏蔽,设置dns是最简单方便的屏蔽广告的办法。

2、轻启动

这个主要是利用手机的辅助功能,自动点击启动页,实现跳过广告的功能


如设置后,这种类似的启动广告,会自动跳过

3、李跳跳

李跳跳和上面轻应用一样,自动跳过对应APP的启动页广告


四、路由器下的所有连接设备

如果你家庭配置了有软路由,可以在软路由上安装一个ADGuard,这个是专门去广告的系统,可以理解成网络层面的应用,所有连接该路由器的设备都默认设置会走他的dns,和过滤规则,一次设置后,网络下的所有设备有识别为广告IP地址或者域名的直接从网络层面拦截,不会到设备端。

我们在帖子
MySQL数据的导出 - brucexia - 博客园 (cnblogs.com)
中讲了MySQL数据的导出,本文讲讲解MySQL数据的导入。

MySQL数据的导入包括使用LOAD DATA INFILE命令导入和使用mysqlimport命令导入。

使用LOAD DATA INFILE方式导入文本文件

MySQL允许将数据导出到外部文件,也可以从外部文件导入数据。MySQL提供了一些导入数据的工具,包括LOAD DATA语句、source命令和mysql命令。LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并输入一张表中。文件名称必须为文字字符串。

LOAD DATA语句的基本格式如下:

LOAD DATA  INFILE 'filename.txt' INTO TABLE tablename [OPTIONS] [IGNORE number LINES]

在LOAD DATA语句中,关键字INFILE后面的filename文件为导入数据的来源;tablename表示待导入的数据表名称;[OPTIONS]为可选参数选项,OPTIONS部分的语法包括FIELDS和LINES子句,其可能的取值有:

—  FIELDS  TERMINATED BY 'value':设置字段之间的分隔字符,可以为单个或多个字符,默认情况下为“\t”。

—  FIELDS  [OPTIONALLY] ENCLOSED BY 'value':设置字段的包围字符,只能为单个字符。如果使用了OPTIONALLY,则只有CHAR和VERCHAR等字符数据字段被包围。

—  FIELDS  ESCAPED BY 'value':控制如何写入或读取特殊字符,只能为单个字符,即设置转义字符,默认值为“\”。

—  LINES  STARTING BY 'value':设置每行数据开头的字符,可以为单个或多个字符,默认情况下不使用任何字符。

—  LINES  TERMINATED BY 'value':设置每行数据结尾的字符,可以为单个或多个字符,默认值为“\n”。

IGNORE number LINES选项表示忽略文件开始处的行数,number表示忽略的行数。执行LOAD DATA语句需要FILE权限。

【例11.19】使用LOAD DATA语句将D:\person0.txt文件中的数据导入test_db数据库的person表中,SQL语句如下:

LOAD DATA  INFILE 'D:\person0.txt' INTO TABLE test_db.person;

导入数据之前,要将person表中的数据全部删除,即登录MySQL,使用DELETE语句删除person表中的数据:

mysql>USE test_db;
Database changed;
mysql
>DELETE FROM person;
Query OK,
10 rows affected (0.00 sec)
从person0.txt文件中导入数据,SQL语句如下:
mysql> LOAD DATA  INFILE 'D:\person0.txt'INTO TABLE test_db.person;
Query OK,
10 rows affected (0.00sec)
Records:
10 Deleted: 0 Skipped: 0 Warnings: 0mysql> SELECT *FROM person;+----+---------+-----+------------+ | id | name | age | info | +----+---------+-----+------------+ | 1 | Green | 21 | Lawyer | | 2 | Suse | 22 | dancer | | 3 | Mary | 24 | Musician | | 4 | Willam | 20 | sports man | | 5 | Laura | 25 | NULL | | 6 | Evans | 27 | secretary | | 7 | Dale | 22 | cook | | 8 | Edison | 28 | singer | | 9 | Harry | 21 | magician | | 10 | Harriet | 19 | pianist | +----+---------+----+-------------+

可以看到,语句执行成功之后,person0.txt文件中的数据导入person表中了。

【例11.20】使用LOAD DATA语句将D:\person1.txt文件中的数据导入test_db数据库中的person表中,使用FIELDS选项和LINES选项,要求字段之间使用“,”间隔,所有字段值用双引号括起来,定义转义字符为“\'”,每行记录以“\r\n”结尾,SQL语句如下:

LOAD DATA INFILE 'D:\person1.txt'INTO TABLE test_db.person
FIELDS
TERMINATED BY
','ENCLOSED BY'\"'ESCAPED BY'\''LINES
TERMINATED BY
'\r\n';

导入数据之前,使用DELETE语句将person表中的数据全部删除,执行过程如下:

mysql>DELETE FROM person;
Query OK,
10 rows affected (0.00sec)
从person1.txt文件中导入数据,执行过程如下:
mysql
> LOAD DATA INFILE 'D:\person1.txt'INTO TABLE test_db .person->FIELDS-> TERMINATED BY ',' -> ENCLOSED BY '\"' -> ESCAPED BY '\'' ->LINES-> TERMINATED BY '\r\n';
Query OK,
10 rows affected (0.00sec)
Records:
10 Deleted: 0 Skipped: 0 Warnings: 0

语句执行成功后,使用SELECT语句查看person表中的记录,结果与【例11.19】的相同。

使用mysqlimport命令导入文本文件

使用mysqlimport命令可以导入文本文件,并且不需要登录MySQL客户端。mysqlimport命令提供许多与LOAD DATA INFILE语句相同的功能,大多数选项直接对应LOAD DATA INFILE子句。使用mysqlimport命令需要指定所需的选项、导入的数据库名称以及导入的数据文件的路径和名称。mysqlimport命令的基本语法格式如下:

mysqlimport -u root-p dbname filename.txt [OPTIONS]

dbname为导入的表所在的数据库名称。注意,mysqlimport命令不指定导入数据库的表名称,数据表的名称由导入文件名称确定,即文件名作为表名,导入数据之前该表必须存在。[OPTIONS]为可选参数选项,其常见的取值有:

—  --fields-terminated-by= 'value':设置字段之间的分隔字符,可以为单个或多个字符,默认情况下为“\t”。

—  --fields-enclosed-by= 'value':设置字段的包围字符。

—  --fields-optionally-enclosed-by= 'value':设置字段的包围字符,只能为单个字符,包括CHAR和VERCHAR等字符数据字段。

—  --fields-escaped-by= 'value':控制如何写入或读取特殊字符,只能为单个字符,即设置转义字符,默认值为“\”。

—  --lines-terminated-by= 'value':设置每行数据结尾的字符,可以为单个或多个字符,默认值为“\n”。

—  --ignore-lines=n:忽视数据文件的前n行。

【例11.21】使用mysqlimport命令将D盘目录下的person.txt文件内容导入test_db数据库中,字段之间使用“,”分隔,字符类型字段值用双引号引起来,将转义字符定义为“?”,每行记录以“\r\n”结尾,SQL语句如下:

C:\ >mysqlimport -u root -p test_db D:\person.txt --fields-terminated-by=, --fields-optionally-enclosed-by=\"--fields-escaped-by=?--lines-terminated-by=\r\n

上面的语句要在一行中输入,语句执行成功后,将把person.txt中的数据导入数据库test_db中。

除了前面介绍的几个选项之外,mysqlimport命令还支持许多别的选项,例如:

—  --columns=column_list, -c column_list:采用逗号分隔的列名作为其值。列名的顺序指示如何匹配数据文件列和表列。

—  --compress,-C:压缩在客户端和服务器之间发送的所有信息(如果二者均支持压缩)。

—  -d,--delete:导入文本文件前清空表。

—  --force,-f:忽视错误。例如,当某个文本文件的表不存在时,继续处理其他文件。不使用--force时,如果表不存在,则mysqlimport退出。

—  --host=host_name,-h host_name:将数据导入给定主机上的MySQL服务器。默认主机是localhost。

—  --ignore,-i:参见--replace选项的描述。

—  --ignore-lines=n:忽视数据文件的前n行。

—  --local,-L:从本地客户端读入输入文件。

—  --lock-tables,-l:处理文本文件前锁定所有表,以便写入。这样可以确保所有表在服务器上保持同步。

—  --password[=password],-p[password]:连接服务器时使用的密码。如果使用短选项形式(-p),则选项和密码之间不能有空格。如果在命令行中--password或-p选项后面没有密码值,则提示输入一个密码。

—  --port=port_num,-P port_num:用于连接的TCP/IP端口号。

—  --protocol={TCP | SOCKET | PIPE | MEMORY}:使用的连接协议。

—  --replace和--ignore选项控制复制唯一键值已有记录的输入记录的处理方式。如果指定--replace,新行替换有相同的唯一键值的已有行;如果指定--ignore,复制已有的唯一键值的输入行将被跳过,不发生替换;如果不指定这两个选项,当发现一个复制键值时会出现一个错误,并且忽视文本文件的剩余部分。

—  --silent,-s:沉默模式。只有出现错误时才输出信息。

—  --user=user_name,-u user_name:连接服务器时MySQL使用的用户名。

—  --verbose,-v:冗长模式。打印出程序操作的详细信息。

—  --version,-V:显示版本信息并退出。

在一个会议上,中国招投标协会的技术负责人居然当着很多领导的面说.NET不能在国产服务器上运行,可以说这个技术负责人非蠢即坏。

国产服务器的处理器架构主要包括x86、ARM、LoongArch、risc-v。这些国产服务器处理器架构各有特点,ARM架构在自主可控和生态建设方面具有优势,x86架构则在现有生态系统和兼容性方面表现突出。LoongArch、risc-v则代表了完全自主可控的最高水平,但生态建设仍需时间来完善。

自从.NET 2014年开源以来,社区还扩展了 .NET 以在其他平台上运行。
三星为其基于ARM的Tizen平台移植了.NET
[1]。
Red Hat

IBM 将 .NET 移植到 LinuxONE/s390x
[2]。
龙芯中科

.NET移植到LoongArch[3]。

三星为其基于RISC-V的Tizen平台移植.NET
[4]。

NET 对 X86、ARM、LoongArch、RISC-V 和 LinuxONE 的支持情况较为全面,特别是在 ARM 和 RISC-V 架构上的支持正在逐步完善中。具体情况如下:

  1. X86 架构


    • .NET 支持 X86 架构,包括 AMD64 和 Intel 64 (x86_64)
    • 操作系统支持Windows、Linux、Mac。
  2. ARM 架构

  • .NET 支持 ARM 架构,包括 ARM32 和 ARM64。
  • 操作系统支持 Windows、Linux。
  • 在国产的服务器上主要以ARM架构为主导,都可以运行.NET 6+ 。
  • LoongArch 架构


    • 龙芯.NET团队对 LoongArch64 架构进行了优化,包括后端指令构建系统、字节码加载、JIT语法树、ABI规范、函数栈帧设计、GC、异常处理等模块的适应性优化,.NET 8 SDK 在 LoongArch64 平台上也进行了优化,集成了 PE32+ 格式的 System.Private.CoreLib.dll 核心库文件,并支持 crossgen2 特性,进一步提升了性能表现。
    • 操作系统支持Linux,包括各种国产Linux服务器, 都可以运行.NET 6+。
  • RISC-V 架构

    • .NET Runtime 提供了初步的 RISC-V 构建支持,代码已经成功测试了 RISC-V 的交叉构建,并可以在 RISC-V 上运行.NET 9,NativeAot的支持正在开发。
    • 三星工程师向微软 .NET Runtime 提交了 PR 提案,让其支持 RISC-V 处理器。
    • 操作系统支持Linux, 支持运行.NET 9。
  • LinuxONE 架构
    • .NET 支持 IBM Z 和 LinuxONE (s390x) 架构。
    • .NET 6.0 以上支持 IBM Z 和 LinuxONE (s390x)。


    相关链接:

    说明

    该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。

    该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。

    说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。

    友情提醒:本篇文章是属于系列文章,看该文章前,建议先看之前文章,可以更好理解项目结构。

    有兴趣的朋友,请关注我吧(*^▽^*)。

    关注我,学不会你来打我

    什么是Aop切面编程

    俗话说:没有使用Aop的系统都不是好系统。

    那么aop到底是什么东西,人们对它的评价如此之高。

    Aop是Aspect Oriented Programming的缩写,意思是“面向切面编程”。

    从字面意思上理解就是把一个功能块切成很多面。

    列如:

    我有10个获取数据的接口,随着代码的不断迭代,现如今想做以下2个操作。

    1、现在对这10个接口做一个【性能监控】,监控这10个接口的调用时间。
    你会怎么做?

    2、对这10个接口做一个【调用监控】,查看调用人、调用时间、传入参数、返回数据等记录。
    你会怎么做?

    有人说,在每个接口中加一点监控代码。

    也有人说,写一个监控方法,在接口中调用该方法。

    但这都不是好的选择,它不仅工作量大、耦合性高,还容易造成错误,不易维护。

    为了解决这种困难,aop诞生了。它在不修改接口原有逻辑的情况下,把接口切分为多个逻辑单元。

    它很好的降低了这方面的耦合性,提高了代码的灵活性和可扩展性。

    它目前的主要作用有:日志记录、安全控制、异常处理、事务处理、安全控制等功能。

    .net8 中Aop的运用

    首先说下:本篇Aop的运用是结合Autofac一起使用,如果对Autofac太不明白,请移步
    从0到1搭建权限管理系统系列四 .net8 中Autofac的使用

    安装:Castle.DynamicProxy(选择最新)、Autofac.Extras.DynamicProxy(选择最新,最新的这个好像是包含了Castle.DynamicProxy)

    编写Aop插件(AopPlugIn),代码如下

    /// <summary>
    ///aop插件/// </summary>
    public classAopPlugIn : IInterceptor
    {
    /// <summary> ///拦截/// </summary> /// <param name="invocation"></param> public voidIntercept(IInvocation invocation)
    {
    //当前调用方法名称 var methodName =invocation.Method.Name;//当前调用方法所在服务名称 var interfaceServiceName = "I" +invocation.TargetType.Name;//获取当前调用的方法信息 var methodInfo =invocation.Method;//当前方法参数数量 var methodParameterCount =methodInfo.GetParameters().Length;//当前接口所有参数 foreach (var parameter inmethodInfo.GetParameters())
    {
    //参数名称 var ParameterName =parameter.Name;//参数值 var ParameterValue =invocation.Arguments[parameter.Position];//参数类型 var ParameterType = invocation.Arguments[parameter.Position] == null ? string.Empty : invocation.Arguments[parameter.Position].GetType().Name;
    }
    /*你可以在方法执行前,编写任何逻辑*/ //执行调用方法 invocation.Proceed();/*你可以在方法执行后,编写任何逻辑*/ //当前接口返回值 var value =invocation.ReturnValue;
    }
    }

    代码解释:该插件相当于一个拦截器,只要被Autofac注册的服务并且要求拦截,那么该服务下的所有接口都会进入拦截器中。

    Intercept():
    在该aop中方法中可以获取当前调用接口的名称、服务名称、参数、返回值等

    invocation.Proceed()
    :执行当前调用的接口。在该方法前后做一些逻辑操作,如日志、性能监控、异常监控等。

    在Autofac中添加Aop集成服务

    如果对Autofac太不明白,请移步
    从0到1搭建权限管理系统系列四 .net8 中Autofac的使用

    编写好aop的插件后,我们需要把aop插件集成到Autofac中,配合完成接口的拦截。代码如下

    /// <summary>
    ///Autofac插件/// </summary>
    public classAutofacPlugIn : Autofac.Module
    {
    /// <summary> ///重写Autofac的Load方法/// </summary> /// <param name="containerBuilder"></param> protected override voidLoad(ContainerBuilder containerBuilder)
    {
    //服务项目程序集 Assembly service = Assembly.Load("DomainService");
    Assembly intracface
    = Assembly.Load("Infrastructure");//注册aop containerBuilder.RegisterType(typeof(AopPlugIn));//项目必须以xxx结尾 containerBuilder.RegisterAssemblyTypes(service).Where(n => n.Name.EndsWith("Service") && !n.IsAbstract)
    .InstancePerLifetimeScope().AsImplementedInterfaces().InterceptedBy(
    typeof(AopPlugIn)).EnableInterfaceInterceptors();
    containerBuilder.RegisterAssemblyTypes(intracface).Where(n
    => n.Name.EndsWith("Repository") && !n.IsAbstract)
    .InstancePerLifetimeScope().AsImplementedInterfaces();
    }
    }

    代码解释:containerBuilder.RegisterType(typeof(AopPlugIn));必须要先注册aop,然后通过InterceptedBy(typeof(AopPlugIn)).EnableInterfaceInterceptors()集成到Autofac中。

    这里要注意下,我们可以在后面添加where条件,来确定哪些接口需要拦截。如果不添加,那么就会拦截Autofac中所有的接口

    测试

    aop的使用,其实就是一个拦截器,拦截被autofac注入的服务接口,所以配置非常简单,当然所有的技术都不是完美的,要看系统进行选择。

    执行之前我们搭建好的接口

    执行:查询所有用户接口GetAllUser()

    可以看到,该接口被成功拦截。我们可以自由的在方法前后,添加业务逻辑,它不会改变原有接口逻辑。

    以上是一些接口的基本信息,及返回值,当然我们可以获取更多接口的信息。

    有了这些信息后,我们就可以做很多逻辑操作,比如之前说的:日志记录、性能监控、调用监控、异常信息、事务处理等。

    以上就是全局异常捕获机制,感兴趣的可以下载项目,修改吧。

    源代码地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api

    预览地址:http://139.155.137.144:8880/swagger/index.html

    帮我Star,谢谢。

    有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

    关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界

    经典统计分析包括了许多常用的统计方法和技术,用于数据的描述、推断和建模。本节将介绍经典统计分析方法(包括t检验、方差分析、卡方检验、线性回归)在R语言中的实现。

    5.1.1  t检验

    样本均值(sample mean),又称样本均数,是描述一组数据集中趋势的重要统计量。它是通过将一组数据的所有数值相加后,再除以这组数据的个数来计算的。在统计学中,方差是每个样本值与样本均值之差的平方的平均值。方差衡量了数据的离散程度,即数据点相对于均值的散布情况。标准差则是方差的平方根,表示数据相对于均值的平均偏离程度。标准差也是一种度量数据分散程度的重要指标。

    t检验是一种统计方法,用于比较两个样本的均值是否存在显著差异。它基于样本均值和样本标准差,通过计算t值来判断两个样本均值是否显著不同。t检验适用于连续变量的独立样本或配对样本的比较,在医学领域中广泛使用。t检验有两种类型:单样本t检验和双样本t检验。

    1. 单样本t检验

    单样本t检验的目的是检验单样本的均值是否与已知总体的均值相等。

    应用场景举例:在某偏远地区随机抽取若干名健康男子,检验其脉搏均值是否高于全体健康男子的平均水平;检验某一线城市全体高三学生的视力水平是否低于全国高三学生的视力水平。

    在R语言中,可以使用t.test函数进行单样本t检验。具体步骤包括:

    设置零假设(H0):假设检验的零假设通常是样本均值等于总体均值。

    收集样本数据。

    运行单样本t检验:使用t.test函数,指定样本数据和总体均值,得出检验结果,包括t值、p值和置信区间。

    2. 双样本t检验

    双样本t检验的目的是检验两个独立样本的均值是存在显著差异,要求两样本独立,服从正态分布或近似正态。

    应用场景举例:为研究某种治疗儿童贫血的新药的疗效,以常规药作为对照,治疗一段时间后,检验施以新药的儿童的血红蛋白的增加量是否比常规药的大;检验两种药物对治疗高血压的效果,检验两组药物的降压水平是否存在显著差异。

    在R语言中,也可以使用t.test函数进行双样本t检验。具体步骤包括:

    设置零假设(H0):假设检验的零假设通常是两个样本的均值相等。

    收集两组独立样本数据。

    运行双样本t检验:使用t.test函数,指定两个样本数据,得出检验结果,包括t值、p值和置信区间。

    在执行t检验时,关键的输出包括t值、自由度、p值和置信区间。p值通常用来判断检验结果的显著性,如果p值小于显著性水平(通常为0.05),则可以拒绝零假设,认为两个样本的均值存在显著差异。执行t检验的示例R代码如下:

    #单样本t检验set.seed(123)

    blood_pressure
    <- rnorm(30, mean = 120, sd = 10) #创建数据blood_pressure

    #执行单样本t检验,比较样本blood_pressure的均值与总体均数mu
    =130的差异

    t_test_single_blood_pressure
    <- t.test(blood_pressure, mu = 130)

    #输出单样本t检验结果

    print(t_test_single_blood_pressure)

    #双样本t检验
    set.seed(123)

    baseline_blood_sugar
    <- rnorm(20, mean = 100, sd = 15) #创建数据baseline_blood_sugar

    endline_blood_sugar
    <- rnorm(20, mean = 120, sd = 15) #创建数据endline_blood_sugar

    #执行双样本t检验,比较样本baseline_blood_sugar和endline_blood_sugar均值的差异

    t_test_double_blood_sugar
    <-t.test(baseline_blood_sugar, endline_blood_sugar)

    #输出双样本t检验结果

    print(t_test_double_blood_sugar)

    运行结果如图5-1所示。该图展示了单样本和双样本t检验的结果,其中p值分别为2.431e-06和0.0003,均小于0.05。结果提示,blood_pressure的均值与总体均数130之间存在显著差异,baseline_blood_sugar与endline_blood_sugar之间均值也存在显著差异,且这种差异具有统计学意义。

    图5-1

    总的来说,t检验是一种常用的假设检验方法,用于比较样本均值之间的差异。在R语言中,使用t.test函数进行t检验非常方便,能够帮助用户快速、准确地进行显著性检验。

    5.1.2  方差分析

    方差分析(Analysis of Variance,简称ANOVA),由英国统计学家R.A.Fisher首创,为纪念Fisher故以“F”命名,所以方差分析又称“F检验”。它用于两个及两个以上样本均值差异的显著性检验。

    方差分析中使用频率最高的是单因素方差分析。它用于分析一类定类数据与定量数据之间的差异性,且定类数据通常为多分类数据。例如,分析不同班级(1班、2班、3班)学习成绩之间的差异时,可以使用单因素方差分析来比较这3个班级学习成绩均值的差异(独立样本t检验只能进行两组数据之间均值差异的比较)。

    在R语言中,可以使用stats包中的aov函数和car包中的Anova函数进行单因素方差分析。具体步骤包括:

    设置零假设(H0):假设检验的零假设通常是所有组的均值相等。

    收集各组样本数据。

    运行单因素方差分析:使用aov函数指定因变量和组变量,使用summary函数获取方差分析的结果,包括F统计量、自由度和p值。

    在方差分析中,关键的输出值为F值和p值。F值用于判断组间均值差异是否显著;当p值小于显著性水平(通常为0.05)时,则可以拒绝零假设,认为组间均值存在显著差异。执行方差分析的示例R代码如下:

    #创建数据框(包含3个组别的计量资料)

    data
    <-data.frame(

    RecoveryTime
    = c(10, 12, 8, 9, 11, 14, 13, 7, 6, 5,11), #恢复时间

    Treatment
    = factor(c("TreatmentA", "TreatmentB", "TreatmentC", "TreatmentA","TreatmentB", "TreatmentC", "TreatmentA", "TreatmentB","TreatmentC", "TreatmentA", "TreatmentB")))#治疗方法

    #进行方差分析

    aov_result
    <- aov(RecoveryTime ~ Treatment, data =data)

    summary(aov_result)

    运行结果如图5-2所示,该图展示了方差分析结果,通过summary(aov())计算得出F值为0.116和p值为0.892。p值大于0.05说明治疗方法对恢复时间没有显著影响。

    图5-2

    总的来说,方差分析是一种常用的统计方法,用于比较组间均值是否有显著差异。在R语言中,使用aov函数和Anova函数进行方差分析非常方便,能够帮助用户快速、准确地进行组间差异比较。

    5.1.3  卡方检验

    卡方检验是一种用于检验两个或多个分类变量之间是否存在相关性的统计方法。卡方检验适用于分析分类数据,通常用于检验观测频数(frequency)与期望频数之间的差异是否显著。频数又称“次数”,是指变量值中代表某种特征的数(标志值)出现的次数。在R语言中,可以使用基本的chisq.test函数进行卡方检验。以下是关于卡方检验的详细介绍。

    在单样本卡方检验中,我们测试一个分类变量的频数是否符合某种理论分布。假设检验的零假设是观测频数符合某种预期的分布。在R语言中,可以使用chisq.test函数指定观测频数和理论频数的期望比例,得出卡方统计量和p值。

    在卡方检验中,关键的输出包括卡方统计量、自由度和p值。p值通常用来判断检验结果的显著性。如果p值小于显著性水平(通常为0.05),则可以拒绝零假设,认为观测频数与期望频数存在显著差异,或者两个分类变量之间存在相关性。

    执行卡方检验的示例R代码如下:

    #创建数据框

    data
    <-data.frame(

    PatientID
    = 1:80,

    Treatment
    = c(rep("TreatmentA", 40), rep("TreatmentB", 40)),

    CureStatus
    = c(rep("Cured", 30), rep("Cured", 30), rep("Not Cured", 20))

    )

    #创建列联表

    table_data
    <-table(data$Treatment, data$CureStatus)

    #进行卡方检验

    chi_result
    <-chisq.test(table_data)

    #输出结果

    print(chi_result)

    代码的运行结果如图5-3所示,该图展示了卡方检验的结果。通过chisq.test函数计算得出的卡方统计量的X-squared值为24.067、p值为9.306e-07。p值小于0.05,说明治疗方法和治愈结果之间存在显著关联。

    图5-3

    总的来说,卡方检验是一种常用的统计方法,用于检验分类变量之间的相关性,能够帮助研究者在数据分析中进行合理的推断。在R语言中,使用chisq.test函数进行卡方检验非常方便,能够快速准确地进行相关性分析。

    5.1.4  简单线性回归分析

    简单线性回归分析是统计学中经常使用的一种方法,用于建立和评估一个自变量对一个连续因变量的线性关系。简单线性回归分析通过拟合一条直线来描述自变量与因变量之间的关系,以预测和解释因变量的变化。下面是关于简单线性回归分析的详细介绍:

    简单线性回归模型可以表示为:

    Y
    =
    β
    0
    +
    β
    1
    X
    +
    ε

    其中,
    Y
    是因变量(响应变量)、
    X
    是自变量、
    β
    0
    是截距项、
    β
    1
    是斜率、
    ε
    是误差项(随机误差)。

    回归分析的目标是通过估计截距和斜率,拟合一条最优的直线来描述自变量和因变量之间的关系。通常使用最小二乘法来估计回归系数,使得预测值与实际值的残差平方和最小化。简单线性回归模型可以用来预测因变量的取值,也可以用来推断自变量和因变量之间的关系程度。

    在R语言中,可以使用lm()函数进行简单线性回归分析。具体步骤包括:

    收集自变量和因变量的数据。

    运行lm()函数,指定因变量与自变量,得出回归系数、拟合直线及相关统计指标。

    通过summary()函数获取回归模型的摘要统计信息,包括截距、斜率、R方值、t值和p值等。

    简单线性回归分析能够帮助研究者理解和预测变量之间的关系,它提供了一种简单而有效的工具来解释和探究数据背后的模式和规律。执行简单线性回归分析的示例R代码如下:

    #创建数据框

    data
    <-data.frame(

    Weight
    = c(61, 75, 83, 92, 100), #体重,单位:千克

    BloodPressure
    = c(110, 123, 130, 150, 160) #血压,单位:毫米汞柱

    )

    #进行简单线性回归分析

    model
    <- lm(BloodPressure ~ Weight, data =data)

    #查看模型输出结果

    summary(model)

    lm()函数中的“BloodPressure ~ Weight”表示正在拟合一个模型,其中血压(BloodPressure)是因变量,体重(Weight)是自变量,“data = data”指定了包含数据的数据框。Summary()函数将提供模型的详细摘要,包括回归系数、截距、R平方值、F统计量和p值等。这些统计量可以帮助我们了解模型的拟合情况和变量之间的线性关系是否显著。代码运行结果如图5-4所示,该图展示了简单线性回归的结果。

    图5-4

    从图5-4中可以看到,截距(Intercept)是26.3778,斜率(Weight的系数)是1.3166,这表示每增加1千克体重,血压平均增加1.3166毫米汞柱;p值为0.02809,小于0.05,表明体重与血压之间存在显著的线性关系;R平方值(Multiple R-squared)为0.965,表示模型解释了96.5%的血压变异。

    https://www.cnblogs.com/brucexia/p/18466799