1.excel中如何使用正则表达式函数提取或替换内容
2.excelVBA代码怎么在单元格中输入数组公式
3.悬赏R语言作业答案
excel中如何使用正则表达式函数提取或替换内容
word中自带正则表达式,函函数不过Excel中却没有内置。数源可以在VBA中定义一个正则表达式函数,函函数然后Excel中就可以调用了。数源VBA代码如下(VBA高亮无效,函函数凑合着看):
1.Function ExStr(Str As String,数源源码clocti Parttern As String, ActionID As Integer, Optional RepStr As String = "")
2. Dim regex As Object
3. Set regex = CreateObject("vbscript.regexp")
4. With regex
5. .Global = True
6. .IgnoreCase = True
7. .MultiLine = True
8. .Pattern = Parttern
9. End With
. Select Case ActionID
. Case 1: '替换
. ExStr = regex.Replace(Str, RepStr)
. Case 2: '判断
. ExStr = regex.test(Str)
. Case 3: '提取
. Dim matches As Object
. Set matches = regex.Execute(Str)
. For Each Match In matches
. ExStr = ExStr & Match.Value
. Next
. End Select
.End Function
'正则表达式 V2
'增加:完善注释
'函数ExStr功能,根据正则表达式,函函数替换或判断或提取字符串
'参数 str 源字符串
'参数 Parttern 正则表达式字符串
'参数 ActionID
'函数功能
'1正则方法一,数源替换符合正则表达式的函函数字符,可选参数RepStr为替换值
'2正则方法二 判断是否有符合正则表达式,有返回“TRUE”,数源无返回“FALSE”
'3正则方法三,函函数提取符合正则表达式的字符
'参数 Repstr 指定替换的字符,可选项,数源默认为空
'附常用几个正则表达式
'第二个参数Parttern为正则表达式,函函数按规则使用即可。数源使用该函数会自动得到匹配结果
'例如,函函数要提取4位数,如下调用即可:=exStr(A1,"\d{ 4}",3)
'替换:=ExStr(B2,"\d{ 4}",1,"")
'判断:=ExStr(C2,"\d{ 4}",2)
'匹配4位数 \d{ 4}
'
'匹配中文字符 [\u4e-\u9fa5]
'匹配双字节字符(包括汉字在内):[^\x-\xff]
'匹配空白行的正则表达式:\n\s*\r
'匹配HTML标记的正则表达式:]*>.*?|
'匹配首尾空白字符的正则表达式:^\s*|\s*$ 可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
'匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)
*'匹配网址URL的正则表达式:[a-zA-z]+://[^\s]
*'匹配帐号是否合法(字母开头,允许5-字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{ 4,}$
'匹配国内电话号码:\d{ 3}-\d{ 8}|\d{ 4}-\d{ 7} 匹配形式如 - 或 -
'匹配腾讯QQ号:[1-9][0-9]{ 4,}
'匹配中国邮政编码:[1-9]\d{ 5}(?!\d)
'匹配身份证:\d{ }|\d{ }
'匹配ip地址:\d+\.\d+\.\d+\.\d+
excelVBA代码怎么在单元格中输入数组公式
Q我想使用VBA代码在单元格中输入数组公式,如何实现?A:Range对象提供了一个FormulaArray属性,可以用来设置或者返回单元格区域中的数组公式,也就是useradd命令的源码说,在工作表单元格中输入完后需要按Ctrl+Shift+Enter组合键才能最终完成的公式。
如下所示,要求工作表Sheet2中所列出的水果总的销售金额,即分别使用各种水果的单价乘以各自的销量后的和。
代码:
Sheet2.Range(“C7”).FormulaArray= “=SUM(B2:B5*C2:C5)”
在单元格C7中输入数组公式并计算结果,如下所示。
上面演示了VBA代码在单个单元格中输入数组公式,如果要在多个单元格中输入数组公式呢?如下面的代码所示:
Sheet3.Range(“B1:B6”).FormulaArray= “=A1:A6=”” Excel”””
判断工作表Sheet3的单元格区域A1:A6中的值是否为“ Excel”,如果是则返回TRUE,否则为FALSE。运行代码后的结果如下所示。
如果需要输入的数组公式在每个单元格中都不同呢?下面以colinlegg.wordpress.com中提供的示例来说明。
如下所示,在列C中输入列E中的值等于其对应的列A单元格中的值或者列F中的值等于其对应的列B单元格中的值时列G中的最大值。
下面的四段代码均可实现。
代码1
Sub test()
Dim r As Long
For r = 2 To 5
Sheet1.Cells(r, 3).FormulaArray = _
“=MAX(IF((($E$2:$E$1 =A”& CStr(r) & “)+($F$2:$F$1 =B” & CStr(r) &”))=1,$G$2:$G$1 ))”
Next r
End Sub
使用循环来完成数组公式在单元格中的输入。
代码2
Sub test1()
With Sheet1
.Range(“C2”).FormulaArray = _
“=MAX(IF((($E$2:$E$1 =A2)+($F$2:$F$1 =B2))=1,$G$2:$G$1 ))”
.Range(“C2:C5”).FillDown
End With
End Sub
代码先在第一个单元格中输入数组公式,然后复制并向下填充公式。
代码3
Sub test2()
With Sheet1
.Range(“C2”).FormulaArray = _
“=MAX(IF((($E$2:$E$1 =A2)+($F$2:$F$1 =B2))=1,$G$2:$G$1 ))”
.Range(“C2”).Copy
.Range(“C3:C5”).PasteSpecialxlPasteFormulas
End With
Application.CutCopyMode = False
End Sub
代码先在第一个单元格中输入公式,然后将其复制,接着粘贴所复制的公式。
代码4
Sub test3()
With Sheet1.Range(“C2:C5”)
.Formula = _
“=MAX(IF((($E$2:$E$1 =A2)+($F$2:$F$1 =B2))=1,$G$2:$G$1 ))”
.FormulaArray = .FormulaR1C1
End With
End Sub
在使用FormulaArray属性时可能会发生下和所示的错误:
其原因可能是有以下几种。
原因1:试图修改数组单元格区域中的某些单元格
例如下面的代码:
Sheet3.Range(“B1:B6”).FormulaArray= “=A1:A6=”” Excel”””
Sheet3.Range(“B1”).Value= “excelperfect”
会导致错误。可以先判断要修改的防阿里微微源码单元格是否处于数组公式区域,例如:
With Sheet3
.Range(“B1:B6″).FormulaArray =”=A1:A6=”” Excel”””
With .Range(“B1”)
If .HasArray Then
MsgBox “单元格处于数组公式区域” & .CurrentArray.Address
End If
End With
End With
原因2:试图在合并单元格中输入数组公式
如果先在单元格中输入数组公式然后再和其他单元格合并,这没有问题。然而,不能够在已经合并的单元格中输入数组公式。例如,下面的代码将失败:
With Sheet3
.Range(“C1:C6”).Merge
.Range(“C2″).FormulaArray =”=A1:A6=”” Excel”””
End With
可以先对要输入数组公式的单元格进行检查:
With Sheet3
.Range(“C1:C6”).Merge
With .Range(“C1”)
If .MergeArea.Address = .Address Then
MsgBox “没有合并单元格”
Else
MsgBox “单元格已合并,地址为: ” & .MergeArea.Address
End If
End With
End With
原因3:数组公式存在语法错误,例如参数缺失或无效参数
WithSheet3.Range(“F1”)
‘SUM函数参数缺失
.FormulaArray = “=SUM()”
‘SUMIF函数的第1个参数和第3个参数不能接受数组
.FormulaArray = “=SUMIF((A1:A2 =1)*(B1:B2 ),B1,C1:C2 )”
End With
原因4:数组公式超过了个字符
VBA帮助中指出,FormulaArray属性的值不能超过个字符。若公式的字符超过个字符,可以使用DailyDoseOfExcel介绍的技巧,使用Replace方法:
Public SubLongArrayFormula()
Dim theFormulaPart1 As String
Dim theFormulaPart2 As String
theFormulaPart1 =”=IF(MONTH(DATE(YEAR(NOW()),MONTH(NOW()),1))-” & _
“MONTH(DATE(YEAR(NOW()),MONTH(NOW()),1)-” & _
“(WEEKDAY(DATE(YEAR(NOW()),MONTH(NOW()),1))-1)+” & _
“{ ;1;2;3;4;5}*7+{ 1,2,3,4,5,6,7}-1),””””,”& _
“X_X_X())”
theFormulaPart2 =”DATE(YEAR(NOW()),MONTH(NOW()),1)-” & _
“(WEEKDAY(DATE(YEAR(NOW()),MONTH(NOW()),1))-1)+” & _
“{ ;1;2;3;4;5}*7+{ 1,2,3,4,5,6,7}-1)”
With ActiveSheet.Range(“E2:K7”)
.FormulaArray = theFormulaPart1
.Replace “X_X_X())”,theFormulaPart2
.NumberFormat = “m””月””d””日”””
End With
End Sub
上述程序将在单元格区域E2:K7中生成当月的日历。
正如本文一开始所的,FormulaArray属性还可以返回单元格中的公式。
如果想要从单个单元格中返回公式,那么无论单元格中是否包含数组公式,Formula属性和FormulaArray属性都会返回相同的结果。然而,Formula属性和FormulaArray属性应用于连续的、多单元格区域时返回不同的结果。
如果单元格区域中含有数组公式,即多个单元格中为一个数组公式,那么FormulaArray属性返回该公式。
如果单元格区域不是数组区域但所有单元格都包含相同的公式,那么FormulaArray属性也返回该通用公式。freebsd内核源码阅读
如果单元格区域不是数组区域且包含的公式不相同,那么FormulaArray属性返回Null。
在上述所有三种情形中,Formula属性返回Variant型数组,数组中的每个元素表示区域中每个单元格的公式。
悬赏R语言作业答案
# 一、R基本操作
# 1、将数据文件mydata1.txt按照以下要求整理成标准形式。
#(1)读入数据文件mydata.txt命名为insurance。
insurance<-read.table("mydata1.txt")
head(insurance)
dim(insurance)#个数据
#(2)将insurance转换为3列的矩阵。
insurance<-matrix(insurance$V1,nrow = ,ncol = 3)#nrow =/3=
insurance
#(3)将insurance转换为数据框。
insurance<-as.data.frame(insurance)
class(insurance)
#(4)将列名命名为"District", "Holders"和"Claims"。
names(insurance)<-c("District", "Holders","Claims")
insurance
#(5)随机无放回抽取行数据。
sub<-insurance[sample(1:nrow(insurance),),]#无放回不用设置replace
sub
#(6)将抽样数据写入result1.txt。
write.table(sub,"result1.txt",row.names = FALSE)
######################################################################
# 2、将数据文件mydata2.txt按照以下要求整理成标准形式。
#(1)读入数据文件mydata2.txt命名为iris。
iris<-read.table("mydata2.txt")
head(iris)
dim(iris)#个数据
#(2)将iris转换为4列的矩阵。
iris<-matrix(iris$V1,nrow = ,ncol = 4)#nrow =/3=
iris
#(3)将iris转换为数据框。
iris<-as.data.frame(iris)
class(iris)
#(4)将列名命名为"Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"。
names(iris)<-c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")
iris
#(5)随机无放回抽取行数据。
sub<-iris[sample(1:nrow(iris),),]#无放回不用设置replace
sub
#(6)将抽样数据写入result2.txt。
write.table(sub,"result2.txt",row.names = FALSE)
######################################################################
# 3.将数据文件data.csv按照以下要求进行数据预处理。
#(1)读入数据文件data.csv命名为nhanes2。国外社交平台源码
nhanes2<-read.csv("data.csv")
#(2) 载入缺失值处理所需要的包。
install.packages("lattice")
install.packages("MASS")
install.packages("nnet")
library(lattice)
library(MASS)
library(nnet)
#(3) 判断nhanes2是否存在缺失值。
sum(is.na(nhanes2))
#(4) 利用插补法处理chl变量的缺失值。
sub=which(is.na(nhanes2[,4])==TRUE)#在数据集中chl变量是第4列,返回nhanes2数据集中第4列为NA的行
dataTR<-nhanes2[-sub,]#将第4列不为NA的数存入数据集dataTR
dataTE<-nhanes2[sub,]#将第4列为NA的数存入数据集dataTE中
dataTE[,4]<-sample(dataTR[,4],length(dataTE[,4]),replace = T)#在非缺失值中简单抽样
dataTE
#(5) 将插补法处理后的数据写入result3.txt。
write.table(dataTE,"result3.txt",row.names = FALSE)
######################################################################
######################################################################
#二、函数调用
#1、测得某班学术X(身高(cm))与Y(体重(kg))的数据如下,试画出散点图,建立线性回归方程,并作进一步分析。
# (1) 建立数据集,并画出散点图,考察数据点的分布趋势,看是否呈直线条状分布。
x1<-c(,,,,,,,,,,,)#身高
y1<-c(,,,,,,,,,,,)#体重
#构建数据集
model <- data.frame(x1,y1)
#探索性分析-做散点图查看数据的分布情况:
plot(x1,y1)
# (2)进行回归分析,列出回归方程,画拟合线,并对结果进行解读。
# 用lm()函数构建模型
lm.reg<-lm(y1~ x1)
# 添加回归曲线查看拟合效果
abline(lm.reg)
#模型解读
summary(lm.reg)
# (3)对回归系数进行假设检验。
anova(lm.reg) # 回归模型的方差分析
summary(lm.reg) #回归系数t检验:提取模型计算结果,其中有t检验的结果
# (4)对回归模型进行诊断。
#模型检验对方程进行进一步检验,以检查回归方程是否满足模型的先验条件及模型的稳健性。
par(mfrow=c(2,2))#画布分面
plot(lm.reg)
#结果解读:
#1.左上图:残差与拟合图,理论上散点应该散乱的分布在横线两侧;
#2.右上图:正太Q-Q图,用于检验因变量的正太分布性,若服从正太分布,则散点应分布在一条直线线
#3.左下图:齐方差检验,若满足其方差,则散点在水平线周围随机分布
#4.右下图:独立性检验,即一个样本是否会影响另一个样本
#################################################################
#2、研究某抗心律失常药对电刺激狗右心室致颤阙的影响,实验测得狗静脉注射不同剂量的抗心律失常药与右心室致颤阙的数据如下,试画出散点图,建立线性回归方程,并作进一步分析。
# (1) 建立数据集,并画出散点图,考察数据点的分布趋势,看是否呈直线条状分布。
x <- c(1,3,5,7,9)
y <- c(8., ., ., ., .)
#构建数据集
model <- data.frame(x,y)
#探索性分析-做散点图查看数据的分布情况:
plot(model)#画散点图
# (2)进行回归分析,列出回归方程,画拟合线,并对结果进行解读。
# 用lm()函数构建模型
fm <- lm(y ~ x)#建立回归模型
fm
# 添加回归曲线查看拟合效果
abline(fm)# 添加回归曲线至散点图
#模型解读
summary(fm)
# (3)对回归系数进行假设检验。
anova(fm) # 回归模型的方差分析
summary(fm) # 提取模型计算结果,其中有t检验的结果
# (4)对回归模型进行诊断。
#模型检验对方程进行进一步检验,以检查回归方程是否满足模型的先验条件及模型的稳健性。
par(mfrow=c(2,2))#画布分面
plot(fm)
#结果解读:
#1.左上图:残差与拟合图,理论上散点应该散乱的分布在横线两侧;
#2.右上图:正太Q-Q图,用于检验因变量的正太分布性,若服从正太分布,则散点应分布在一条直线线
#3.左下图:齐方差检验,若满足其方差,则散点在水平线周围随机分布
#4.右下图:独立性检验,即一个样本是否会影响另一个样本
##################################################################
# 3、countries数据集含有个国家和地区的出生率与死亡率。
# (1) 请使用K-均值聚类将样本点聚为3个类别。
countries=read.csv("countries.csv")
head(countries)#查看前6行
names(countries)=c("country","birth","death")#修改变量名称
var=as.character(countries$country)#将变量country转为字符型并赋值给var
for(i in 1:) row.names(countries)[i]=var[i]#将数据集的行名命名为国家名称
km1=kmeans(countries[,-1],center=3)#用kmeans算法对countries数据集进行聚类
# (2) 输出聚类结果及各类别的中心点坐标。
km1$cluster#获取类别
km1$centers#获取中心点坐标
# (3) 绘制聚类结果将中心点以星号标识。
#画出聚为四类的类别图,标注中心点。
plot(countries[,-1],pch=c(1,2,3))
#将中心点用星号标示出来
points(km1$centers,pch=8,col="red")
#对中心点添加标注
legend(km1$centers[1,1],km1$centers[1,2],"Center_1",bty="n",xjust=0.5,cex=0.8)
legend(km1$centers[2,1],km1$centers[2,2],"Center_2",bty="n",xjust=0.5,cex=0.8)
legend(km1$centers[3,1],km1$centers[3,2],"Center_3",bty="n",xjust=0.5,cex=0.8)
# (4) 判断与中国大陆同属于一个类别的国家和地区有哪些。
cluster_CHINA=km1$cluster[which(countries$country=="CHINA")]
which(km1$cluster==cluster_CHINA)
###############################################################
###############################################################
#三、数据分析
# 1、使用arules软件包中的Groceries数据集,该数据集是某一食品杂货店一个月的真实交易数据,使用R完成以下要求:(软件包:arules;数据集:Groceries; 函数:apriori())
# (1)利用apriori()函数进行关联分析,支持度为0.,置信度为0.5。
install.packages("arules")
library(arules)
data("Groceries")
rules0<-apriori(Groceries,parameter=list(support=0.,confidence=0.5))
inspect(rules0[1:])
# (2)利用sort()函数按照支持度排序。
rules.sorted_sup<-sort(rules0,by="support")
inspect(rules.sorted_sup[1:5])
# (3)捆绑销售:寻找蛋黄酱(mayonnaise)的捆绑商品。(supp=0.,conf=0.1,minlen=2, maxlen=6)
rules1=apriori(Groceries,parameter=list(minlen=2,maxlen=6,supp=0.,conf=0.1),appearance=list(rhs="mayonnaise",default="lhs"))
inspect(rules1)
# (4)查看销量最高的商品。
itemsets_apr=apriori(Groceries,parameter=list(supp=0.,target="frequent itemsets"),control=list(sort=-1))
inspect(itemsets_apr[1:5])
# (5)适合捆绑销售的商品。(supp=0.,minlen=2, maxlen=3)
itemsets_apr1=eclat(Groceries,parameter=list(supp=0.,minlen=2,maxlen=3,target="frequent itemsets"),control=list(sort=-1))
inspect(itemsets_apr1[1:5])
# (6)关联规则的可视化(support=0.,con=0.5)
install.packages("arulesViz")
library(arulesViz)
rules5=apriori(Groceries,parameter=list(support=0.,con=0.5))
rules5
plot(rules5)
#######################################################################
# 2、根据breast-cancer-wisconsin.csv威斯康星州乳腺癌数据集,通过对数据的分析,提取出关键特征来判断乳腺癌患病情况。(软件包:rpart;函数:rpart()。)
# (1)属性名依次设置为"编号","肿块厚度","肿块大小","肿块形状","边缘黏附","单个表皮细胞大小","细胞核大小","染色质","细胞核常规","有丝分裂","类别"),并将类别为2的设为"良性",为4的设为"恶性"。
install.packages("rpart")
library(rpart)
install.packages("rpart.plot")
library(rpart.plot)
#############加载数据
breast.cancer<-read.csv('breast-cancer-wisconsin.csv',header=F)
head(breast.cancer)
#数据整理
names(breast.cancer)=c("编号","肿块厚度","肿块大小","肿块形状","边缘黏附","单个表皮细胞大小","细胞核大小","染色质","细胞核常规","有丝分裂","类别")
breast.cancer$类别[breast.cancer$类别==2]="良性"
breast.cancer$类别[breast.cancer$类别==4]="恶性"
head(breast.cancer)
# (2)抽取训练数据集为原数据的%,测试数据集取%。
#数据预处理(分层抽样,划分训练集和测试集)
#分别计算良性和恶性组中应抽取测试集样本数,记为a,b
a=round(0.3*sum(breast.cancer$类别=="良性"))
b=round(0.3*sum(breast.cancer$类别=="恶性"))
a;b #输出a,b值
install.packages("sampling")
library(sampling)
#使用strata函数对数据集中的“分组油耗”变量进行分层抽样
sub=strata(breast.cancer,stratanames="类别",size=c(b,a),method="srswor")
sub #所抽出的所有测试集样本信息
#生成训练集train1和测试集test1
train1=breast.cancer[-sub$ID_unit,]
test1=breast.cancer[sub$ID_unit,]
nrow(train1);nrow(test1) #显示训练集和测试集的行数,检查两者比例是否为7:3
# (3) minsplit=5,建立决策树。
#CART建立分类树
formula_cla=类别~肿块厚度+肿块大小+肿块形状+边缘黏附+单个表皮细胞大小+细胞核大小+染色质+细胞核常规+有丝分裂
cla1=rpart(formula_cla,train1,method="class",minsplit=5)#
cla1
# (4)选择cp=0.来剪枝。
######修改cp的值
cla2=rpart(formula_cla,train1,method="class",minsplit=5,cp=0.)
cla2
# (5)画出type为2和4的树图。
rpart.plot(cla1,type=2)#修改type
rpart.plot(cla1,type=4)
# (6)测试数据进行预测,并输出混淆矩阵,给出模型准确率为。
#预测
pre1=predict(cla1,test1,type="class")
pre1
table(test1$类别,pre1)#获取混淆矩阵
#计算样本错误率
error1<-sum(as.numeric(pre1!=test1$类别))/nrow(test1)
error1
###################################################################
# 3、美国科罗拉多州某加油站连续 天的OVERSHORTS序列“OVERSHORTS.csv”
# (1) 判断该序列的平稳性与纯随机性。
# (时序图检验、白噪声检验)
install.packages("fUnitRoots")
install.packages("TSA")
install.packages("forecast")
install.packages("zoo")
library(fUnitRoots)
library(TSA)
library(forecast)
library(zoo)
#读取数据
c<-read.csv("OVERSHORTS.csv")
#转换为时间序列
overshort<-ts(c$overshort,start = 1)
#平稳性,纯随机(白噪声检验)
## 绘制序列的时间序列图
plot.ts(overshort, xlab = "time", ylab = "prop")
##对序列做单位根检验
unitrootTest(overshort)
##对序列做白噪声检验
Box.test(overshort, lag = 1, type = "Ljung-Box")
# (2) 如果序列平稳且非白噪声,选择适当模型拟合该序列的发展。(分)
# (模型的识别、参数估计(模型显著性、模型参数的显著性))
#模型识别
##观察自相关,偏自相关图,模型定阶
par(mfrow=c(1,2))
acf(overshort)###衰减到零是突然的,所以自相关系数1阶截尾
pacf(overshort)### 衰减到零不是突然的,所以偏相关系数托尾
# 推荐模型为 MA(1)
##或者对序列进行模型识别,自动定阶
auto.arima(overshort)# 推荐模型为 MA(1)
#参数估计
###模型检验
x.fit<-arima(overshort,order=c(0,0,1),method="ML")
x.fit
##对残差x.fit$residual进行白噪声检验
for(i in 1:2) print(Box.test(x.fit$residual,lag=6*i))
##P>0.,接受原假设,即残差为白噪声,所以拟合模型显著有效
####参数检验
###模型参数的显著性检验
t1<--0./0.
pt(t1,df=,lower.tail=T) ###p<0.参数显著非零
t0<--4./1.
pt(t0,df=,lower.tail=T) ###p<0.参数显著非零
# (3) 利用拟合模型,预测该加油站未来5天的OVERSHORTS。(分)
# (模型预测、绘制预测图)
####模型预测
c<-read.csv("OVERSHORTS.csv")
x<-ts(c$overshort,start=1)
x.fit<-arima(x,order=c(0,0,1))
x.fit
x.fore<-forecast(x.fit,h=5)#预测
x.fore
plot(x.fore)
##############################################################
#4、使用是survival软件包中的“pbc”数据集,该数据集记录的是肝硬化数据, 使用R完成一下要求:(软件包:survival;数据集:pbc; 函数:Surv()、survfit()、survdiff()、coxph()、cox.zph(), 将答案保存在“姓名.doc”文件中。)
# (1)生成生存分析对象,拟合生存曲线模型。
install.packages("survival") #安装survival包
library(survival) #加载survival包
#使用survival包自带的“pbc”数据集为例(*)
data("pbc")
str(pbc)
head(pbc)
#生成生存分析对象
Sur_Obj<-Surv(pbc$time,pbc$status)
Sur_Obj
#拟合曲线模型
model<-survfit(Sur_Obj~1)
summary(model)
# (2)两种方法绘制生存曲线。
plot(model,ylab = "生存率",xlab="天")
#用survminer进行漂亮的展示
install.packages("survminer")
library(survminer)
ggsurvplot(model, data = pbc)
# (3)进行单因素比较分析,并进行结果解释。
#survdiff(formula)函数进行log-rank检验。
survdiff(Sur_Obj~pbc$trt) #trt是分组条件
# (4)考虑年龄,性别以及trt是否会影响肝硬化的生存时间,进行多因素分析Cox模型的建立,并进行结果解释。
coxmodel<-coxph(Sur_Obj~pbc$age+pbc$sex+pbc$bili)
coxmodel
# (5)模型诊断——PH检验。
zphmodel<-cox.zph(coxmodel)
zphmodel
##############################################################
# 5、life.csv为位急性淋巴细胞白血病病人的数据,包括:入院治疗时取得外辕血中细胞数X1,淋巴结浸润等级X2,出院后有无巩固治疗X3(1表示有巩固治疗,0表示无巩固治疗);随访后,变量Y=0表示生存期在1年以内,Y=1表示生存时间在1年以上,使用R完成一下要求:(函数:glm(),predict()。)
# (1)建立全变量logistic回归,对模型结果进行解释。
life<-read.csv("life.csv")
#建立全变量logistic回归
glm.sol<-glm(Y~X1+X2+X3, family=binomial, data=life)
#回归模型解读
summary(glm.sol)
# (2)预测当X1=5,X2=2,X3=0时,y的概率是多少?
pre<-predict(glm.sol, data.frame(X1=5,X2=2,X3=0))
p<-exp(pre)/(1+exp(pre))
p
# (3)预测当X1=5,X2=2,X3=1时,y的概率是多少?(6分)
pre<-predict(glm.sol, data.frame(X1=5,X2=2,X3=1))
p<-exp(pre)/(1+exp(pre))
p
# (4)对回归模型参数进行检验,用step()函数做变量筛选。
step(glm.sol)
glm.new<-glm(Y~X2+X3, family=binomial, data=life)
summary(glm.new)
# (5)对筛选后的变量进行建模,预测。
pre<-predict(glm.new, data.frame(X2=2,X3=0))
p<-exp(pre)/(1+exp(pre))
p
pre<-predict(glm.new, data.frame(X2=2,X3=1))
p<-exp(pre)/(1+exp(pre))
p