关于R语言报错:invalid argument to unary operator(一元运算符的无效参数)---ggplot2画图问题--解决Monte Carlo模拟输出

目录

背景

我的操作(错误

解决问题过程:

1)查找 

2)尝试将画图等过程从函数中移出来

3)尝试将+geom_line(aes(y=h_mean-sqrt(h_var))移入到前面的一行中去

结果

总结


背景

根据Monte Carlo模拟输出:

给定函数 h(x)=[cos(50x)+sin(20x)]^{2}\small \frac{1}{n}\sum h(U_{j})估计积分值\small \int_{1}^{0}h(x)dx, 其中(U_{1},U_{2},...,U_{n})样本服从[0,1]上的一致分布。
做下面工作: (1) 画出上述估计值随?变化图。(2)并且画出置信 曲线。(3) 输出最后的估计值。

 

完整代码:

library(ggplot2)#置入ggplot2包,方便画图
mean_standard_error<-function(n){
  h_mean<-vector(length=n)#给定一个长度为n的向量,首先创建向量,以后赋值
  h_var<-vector(length=n)
  for(i in 1:n){
    U<-runif(i)#生成i个服从[0,1]均匀分布的随机数,循环
    h<-(cos(50*U)+sin(20*U))^2#由随机数计算出随机函数
    h_mean[i]<-mean(h)#均值
    h_var[i]<-sum((h-mean(h))^2)/i^2#方差
    
  }
  tim<-1:n
  d<-data.frame(tim,h_mean,h_var)
  p<-ggplot(d,aes(x=tim,y=h_mean))
  +geom_line(aes(y=h_mean-sqrt(h_var)),colour="red",linetype="dotted")#画出置信下限
  q<-p+geom_line(aes(y=h_mean+sqrt(h_var)),colour="green",linetype="dotted")+geom_line()
#在置信上限的基础上,继续画出置信下限
  list(d$h_mean[n],q)#利用列表的形式,方便在执行函数时,同时返回所有需要的结果
}

n<-10000
mean_standard_error(10000)

我的操作(错误

p<-ggplot(d,aes(x=tim,y=h_mean))
  +geom_line(aes(y=h_mean-sqrt(h_var)),colour="red",linetype="dotted")

#注意,这里是分两行写的

出现错误

Error in +geom_line(aes(y = h_mean - sqrt(h_var)), colour = "red", linetype = "dotted") : 
  invalid argument to unary operator

解决问题过程:

1)查找 

  invalid argument to unary operator意思,一直以为是自己在利用一个向量减去一个常数步骤上面出错。就这样我尝试

tim<-1:n
d<-data.frame(tim,h_mean,h_var)
###这底下是我自己以为是两个向量相减有问题尝试加的
a<-vector(length = n)
b<-vector(length = n)
for(i in 1:n){
a[i]<-h_mean[i]-sqrt(h_var[i])
b[i]<-h_mean[i]+sqrt(h_var[i])
}
d1<-d(d,a,b)
###d这个数据框中又加了a,b---->d1
p<-ggplot(d1,aes(x=tim,y=h_mean))
+geom_line(aes(y=a),colour="red",linetype="dotted")
q<-p+geom_line(aes(y=b),colour="green",linetype="dotted")+geom_line()

结果还是错

2)尝试将画图等过程从函数中移出来

给n一个具体的值,直接进行计算。

n<-100
h_mean<-vector(length=n)
h_var<-vector(length=n)
for(i in 1:n){
U<-runif(i)#生成i个服从[0,1]均匀分布的随机数
h<-(cos(50*U)+sin(20*U))^2
h_mean[i]<-mean(h)
h_var[i]<-sum((h-mean(h))^2)/i^2
}
tim<-1:n
d<-data.frame(tim,h_mean,h_var)
p<-ggplot(d,aes(x=tim,y=h_mean))
+geom_line(aes(y=h_mean-sqrt(h_var)),colour="red",linetype="dotted")
q<-p+geom_line(aes(y=h_mean+sqrt(h_var)),colour="green",linetype="dotted")+geom_line()
list(d$h_mean[n],q)

结果还是错误

3)尝试将+geom_line(aes(y=h_mean-sqrt(h_var))移入到前面的一行中去

结果正确!!!!

p<-ggplot(d,aes(x=tim,y=h_mean))+geom_line(aes(y=h_mean-sqrt(h_var)),colour="red",linetype="dotted")

运行代码:

结果

标题mean_standard_error(10000)

总结

是自己基础知识掌握不够牢固,没有意识到前一行中的完整代码不能直接移到下一行让R编辑器以为这是一个行完整的代码。事实上,R并不能够识别出来。所以以后写代码还是要严谨,初学者容易出现这类的错误,所以以后学习编程一定要将最基础的东西语法搞明白不能随意自己换行啊啥的。

上面自己写下了自己解决问题的步骤,希望能够启发自己更快速的解决问题,也给那些遇到同样问题的求知者一些参考~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值