一个菜鸟学习R语言的历程(一)

菜鸟也有梦想!

写在前面:本人的确是一只菜鸟,大学没学过编程,对于C语言和java也只是耳闻,R语言和Python是大学毕业后才知道(卑微)。本科只用过SPSS和EXCEL分析数据,目前马上研二,才认识到编程的重要性以及它的神奇。在Python和R之间选择了R来作为学习的主要目标,想达到的水平就是能够用R绘制论文中各种图和进行数据分析。不知道这个学习的历程持续多久,希望我能坚持到底!不断的学习,反复的练习!不求成为高手,只求从入门的菜鸟蜕变为一个真正的R使用者。

入门

我也不知道现在算不算入门了… ̄□ ̄||,最近一边上课一边自学,上课的内容难度较大,自学是从最基本的开始。网课老师讲的不够仔细而且听久了容易感到枯燥,也无法保证每个语句都有时间动手敲一遍。但是,在自学的过程中,可以充分体验复制粘贴的快乐哈哈哈,而且可以选择自己感兴趣的packages进行学习,不懂的可以通过各种途径搜索,查得多了,看得多了,敲得多了,对代码的认识也越来越深刻。
推荐一个学习R的包swirl,R亲自带我们学习!

install.packages("swirl")
library(swirl)

用了大约一天半的时间刷完了所有的模块,感觉很有意思,是一种引导式的学习。虽然都是最基本的东西,但对于入门者来说,能够学到不少,我本人受益匪浅,并且刷一遍不够,要多刷几遍,才能信手拈来。另外,给大家推荐一本书《R与tidyverse——数据分析入门》,前几章是对R的基本介绍,后面我还没看。网址:
https://tianyishi2001.github.io/r-and-tidyverse-book/import-export.html
在知乎上看到有大佬买了很多R语言的书,虽然我照着全买下来,但是我深知根本看不完!所以基于目前的需求,买了其中一本《ggplot:数据分析与图形艺术》。还在路上…

学习T检验

第一课,先来回顾一下数据分析中比较常用的T检验。
t检验,亦称student t检验(Student’s t test),主要用于样本含量较小(例如n < 30),总体标准差σ未知的正态分布
适用条件:
(1) 已知一个总体均数;
(2) 可得到一个样本均数及该样本标准差;
(3) 样本来自正态或近似正态总体。

T检验可以分为单总体检验双总体检验,以及配对样本检验

  1. 单总体t检验是检验一个样本平均数与一个已知的总体平均数的差异是否显著。举个例子,某地区年均降水量为400mm,而我们在近十年(2008-2018年)获取每年的年均降水量,分别是388,379,401,390,417,402,376,399,411,420mm。问题:近十年的年均降水量与该地区的历史年均降水量有没有显著性差异?

代码如下:

precipitation <- c(388,379,401,390,417,402,376,399,411,420)
t.test(precipitation, alternative = "greater", mu = 400 )
#alternative表示备择假设,two.sided(缺省),双边检验(H1:μ≠H0),less表示单边检验(H1:μ<μ0),greater表示单边检验(H1:μ>μ0)
#mu表示原假设μ0,paired表示是否配对样本T检验,conf.level置信水平,即1-α,通常是0.95
#var.equal是逻辑变量,var.equal=TRUE表示两样品方差相同,var.equal=FALSE(缺省)表示两样本方差不同。

运行后结果如下:

One Sample t-test

data:  precipitation
t = -0.35636, df = 9, p-value = 0.3649
alternative hypothesis: true mean is less than 400
95 percent confidence interval:
     -Inf 407.0447
sample estimates:
mean of x 
    398.3 

检验结果为t=-0.35636,显著性P值=0.3649>0.05,接受原假设,说明近十年的年均降水量与历史年均降水量无显著差异。

  1. 双总体t检验是检验两个样本平均数与其各自所代表的总体的差异是否显著。双总体t检验又分为两种情况,一是独立样本t检验(各实验处理组之间毫无相关存在,即为独立样本),该检验用于检验两组非相关样本被试所获得的数据的差异性;一是配对样本t检验,用于检验匹配而成的两组被试获得的数据或同组被试在不同条件下所获得的数据的差异性,这两种情况组成的样本即为相关样本。
    (1)独立样本t检验
    例子:两个坡面,一个阳坡,一个阴坡,100cm的土壤剖面,从上往下每隔10cm取一次土样,测定土壤含水量。类似于双因素十水平。(阳坡:8.39,9.71,7.47,6.75,7.69,10.66,8.08,10.07,9.27,7.88%;阴坡:8.46,10.71,8.17,6.48,8.09,9.87,8.99,11.07,10.27,7.46%)问题:阴坡与阳坡的土壤含水量在100cm剖面的分布是否有显著差异?
    代码如下:
library(car)
yangpo <- c(8.39,9.71,7.47,6.75,7.69,10.66,8.08,10.07,9.27,7.88)
yinpo <- c(8.46,10.71,8.17,6.48,8.09,9.87,8.99,11.07,10.27,7.46)
shapiro.test(yangpo)
shapiro.test(yinpo)
#正态分布检验
y <- c(8.39,9.71,7.47,6.75,7.69,10.66,8.08,10.07,9.27,7.88,8.46,10.71,8.17,6.48,8.09,9.87,8.99,11.07,10.27,7.46)
group=as.factor(c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2))
leveneTest(y = y, group=group)
#方差齐性检验
a <- factor(c(rep(1,10),rep(2,10)))
leveneTest(y~group)
#方差齐性检验(看起来代码简单一些,但结果是一样的)

运行后结果如下:

> shapiro.test(yangpo)

	Shapiro-Wilk normality test

data:  yangpo
W = 0.95519, p-value = 0.73

> shapiro.test(yinpo)

	Shapiro-Wilk normality test
data:  yinpo
W = 0.96352, p-value = 0.8251

R自身包含var.test和bartlett.test方差齐性检验,分别对应两组和多组数据。在car包中有levene.test(也是SPSS的默认方差齐性检验方法)。在此选用了levene.test(),也就是新版本中的leveneTest()。

> leveneTest(y = y, group=group)
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  1  0.3365 0.5691
      18   
> leveneTest(y~group)
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  1  0.3365 0.5691
      18   

可以看出,阴坡和阳坡的显著性P值均大于0.05,符合正态分布,也通过了方差齐性检验。
接下来进行t检验:

t.test(yangpo,yinpo,paired = FALSE)

结果如下:

> t.test(yangpo,yinpo,paired = FALSE)

	Welch Two Sample t-test

data:  yangpo and yinpo
t = -0.58114, df = 17.532, p-value = 0.5685
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.663954  0.943954
sample estimates:
mean of x mean of y 
    8.597     8.957 

显著性P值=0.5685>0.05,说明阴坡与阳坡的土壤含水量在100cm剖面没有显著差异。
(2)配对t检验
例子:人工降雨试验,雨强是60,时间10min,每隔1min收集一次径流。设置两个土槽,控制单一变量,即坡度分别为10°和20°。(10°:1,2,3,4,5,6,7.5,8,8.2,8.5;20°:2,4,6,8,10,11,11.5,12,12.3,12.4)
在此就不进行正态分布和方差齐性检验了,直接进行t检验。
代码如下:

ten <- c(1,2,3,4,5,6,7.5,8,8.2,8.5)
twenty <- c(2,4,6,8,10,11,11.5,12,12.3,12.4)
t.test(ten,twenty,paired=TRUE)

运行后结果如下:

	Paired t-test

data:  ten and twenty
t = -8.9938, df = 9, p-value = 8.587e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -4.505491 -2.694509
sample estimates:
mean of the differences 
                   -3.6 

可以看到显著性P值= 8.587e-06,远小于0.001,两个坡度之间的径流量具有极显著差异,或者说坡度对径流量具有显著影响。(表述可能不够规范)

今天的学习任务结束!明天继续加油ヾ(◍°∇°◍)ノ゙
  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是一个使用 Delphi 语言监控 Windows 系统进程的示例程序: ``` uses Windows, TlHelp32; function EnumProcesses: string; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := ''; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin Result := Result + FProcessEntry32.szExeFile + #13#10; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; begin ShowMessage(EnumProcesses); end. ``` 这个程序使用了 Windows 库中的 `TlHelp32` 和 `Windows` 单元,通过调用 `CreateToolhelp32Snapshot` 和 `Process32First` 函数获取系统中的进程列表,然后使用 `Process32Next` 函数遍历进程列表,最后使用 `CloseHandle` 函数关闭快照句柄。程序最后使用 `ShowMessage` 函数显示所有进程的名称。 请注意,在使用这个程序之前,你需要在你的程序中包含 `TlHelp32` 和 `Windows` 单元。 ### 回答2: 在Delphi中可以使用TProcess类来监控Windows系统进程。下面是一个示例代码: ``` unit MainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses ShellApi; procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := not Timer1.Enabled; // 启动/停止定时器 if Timer1.Enabled then Button1.Caption := '停止监控' else Button1.Caption := '开始监控'; end; procedure TForm1.Timer1Timer(Sender: TObject); var ProcessInfo: TProcessInformation; ProcessCount: Integer; i: Integer; begin ProcessCount := GetNumberOfProcesses; Memo1.Clear; Memo1.Lines.Add('当前进程数量:' + IntToStr(ProcessCount)); Memo1.Lines.Add(''); for i := 0 to ProcessCount - 1 do begin // 获取进程id ProcessInfo.dwProcessId := GetProcessId(i); // 获取进程句柄 ProcessInfo.hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_TERMINATE, False, ProcessInfo.dwProcessId); if ProcessInfo.hProcess <> 0 then begin try // 获取进程路径 SetLength(Buffer, MAX_PATH); if GetProcessImageFileName(ProcessInfo.hProcess, @Buffer[1], MAX_PATH) > 0 then begin // 显示进程路径 Memo1.Lines.Add('进程ID:' + IntToStr(ProcessInfo.dwProcessId)); Memo1.Lines.Add('路径:' + Buffer); Memo1.Lines.Add(''); end; finally // 关闭进程句柄 CloseHandle(ProcessInfo.hProcess); end; end; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Timer1.Enabled := False; // 关闭时停止定时器 end; end. ``` 这个例子创建了一个Delphi窗体应用程序,其中包含一个Memo组件、一个Button组件和一个Timer组件。当点击按钮时,开启或关闭定时器;定时器超时时,获取当前运行的进程数量和每个进程的路径,并将其显示在Memo控件中。 请注意,此示例代码仅作为参考,需根据实际需要和环境进行适当修改和调整。 ### 回答3: 在Delphi中,我们可以使用TProcess类来实现监控Windows系统进程的功能。以下是一个示例代码: ```delphi uses Windows, SysUtils, Classes; type TProcessMonitor = class private FProcessName: string; FTimer: TTimer; procedure OnTimer(Sender: TObject); public constructor Create(const AProcessName: string); destructor Destroy; override; procedure StartMonitoring; procedure StopMonitoring; end; constructor TProcessMonitor.Create(const AProcessName: string); begin FProcessName := AProcessName; FTimer := TTimer.Create(nil); FTimer.Interval := 1000; // 设置定时器间隔1秒 FTimer.OnTimer := OnTimer; end; destructor TProcessMonitor.Destroy; begin FTimer.Free; inherited; end; procedure TProcessMonitor.StartMonitoring; begin FTimer.Enabled := True; // 启动定时器 end; procedure TProcessMonitor.StopMonitoring; begin FTimer.Enabled := False; // 停止定时器 end; procedure TProcessMonitor.OnTimer(Sender: TObject); var ProcessHandle: THandle; ProcessId: DWORD; ProcessFound: Boolean; ProcessName: array[0..MAX_PATH] of Char; begin ProcessFound := False; ProcessHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); if ProcessHandle <> INVALID_HANDLE_VALUE then begin ProcessId := 0; ProcessName[0] := #0; if Process32First(ProcessHandle, TProcessEntry32(ProcessName)) then begin repeat if CompareText(ExtractFileName(ProcessName), FProcessName) = 0 then begin ProcessFound := True; ProcessId := TProcessEntry32(ProcessName).th32ProcessID; Break; end; until not Process32Next(ProcessHandle, TProcessEntry32(ProcessName)); end; CloseHandle(ProcessHandle); end; if ProcessFound then ShowMessage('进程 "' + FProcessName + '" 在运行中,进程ID为: ' + IntToStr(ProcessId)) else ShowMessage('进程 "' + FProcessName + '" 未找到'); end; ``` 使用示例: ```delphi var ProcessMonitor: TProcessMonitor; procedure TForm1.Button1Click(Sender: TObject); begin ProcessMonitor := TProcessMonitor.Create('notepad.exe'); ProcessMonitor.StartMonitoring; end; procedure TForm1.Button2Click(Sender: TObject); begin ProcessMonitor.StopMonitoring; ProcessMonitor.Free; end; ``` 上述代码中,我们创建了一个TProcessMonitor类来进行进程监控。在构造函数中,我们传入要监控的进程名。StartMonitoring方法启动了一个定时器,在每次触发定时器事件时,通过调用CreateToolHelp32Snapshot方法和Process32First、Process32Next遍历系统进程来查找指定的进程名。如果找到了,就显示进程ID;否则显示未找到的提示信息。使用示例中的代码可以在点击按钮1时开始监控notepad.exe进程,点击按钮2时停止监控。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值