当前位置:编程学习 > 网站相关 >>

R语言:求二维随机变量数学期望

想做一个二维变量数学期望实验, 查看若干资料终于找到方法

先看这篇文章熟悉一下R的函数
 

构造数据
通过下面的函数构造了,正态分布和泊松分布的两列数据


A <- data.frame(a=round(rnorm(10,20,9)), b=rpois(10, lambda=10))


[cpp]
> A <- data.frame(a=round(rnorm(10,20,9)), b=rpois(10, lambda=10)) 
> A 
    a  b 
1  22 14 
2  21  7 
3  20 11 
4  20 10 
5  12 13 
6  17 15 
7  15  9 
8   3  8 
9  14 12 
10  3  9 

> A <- data.frame(a=round(rnorm(10,20,9)), b=rpois(10, lambda=10))
> A
    a  b
1  22 14
2  21  7
3  20 11
4  20 10
5  12 13
6  17 15
7  15  9
8   3  8
9  14 12
10  3  9


如何理解这个数据:

  可以这样来, 就是说我拿了一个零件它的长是A,宽是B, 我在a, b 填入这些数据, 我总共查看了10个零件, 就得到上面这些数据

  这样这批零件矩形的长服从正态分布 均值是20, 方差是9,  而宽服从泊松分布 lambda是 10 (我们对正态分布强行取整,编译实验)


构造频率表

用 mytable <-table(A[[1]],A[[2]]) 直接得到

 

[cpp]
> mytable <-table(A[[1]],A[[2]]) 
> mytable 
     
     7 8 9 10 11 12 13 14 15 
  3  0 1 1  0  0  0  0  0  0 
  12 0 0 0  0  0  0  1  0  0 
  14 0 0 0  0  0  1  0  0  0 
  15 0 0 1  0  0  0  0  0  0 
  17 0 0 0  0  0  0  0  0  1 
  20 0 0 0  1  1  0  0  0  0 
  21 1 0 0  0  0  0  0  0  0 
  22 0 0 0  0  0  0  0  1  0 

> mytable <-table(A[[1]],A[[2]])
> mytable
   
     7 8 9 10 11 12 13 14 15
  3  0 1 1  0  0  0  0  0  0
  12 0 0 0  0  0  0  1  0  0
  14 0 0 0  0  0  1  0  0  0
  15 0 0 1  0  0  0  0  0  0
  17 0 0 0  0  0  0  0  0  1
  20 0 0 0  1  1  0  0  0  0
  21 1 0 0  0  0  0  0  0  0
  22 0 0 0  0  0  0  0  1  0

 

如何理解:

   二维随机变量 X,Y 可能值构成矩阵中所有的点, 值表示样本的出现次数

求列的边沿概率密度

v = margin.table(mytable,1) /  margin.table(mytable)


[cpp]
> v = margin.table(mytable,1) /  margin.table(mytable)  
> v 
 
  3  12  14  15  17  20  21  22  
0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1  

> v = margin.table(mytable,1) /  margin.table(mytable)
> v

  3  12  14  15  17  20  21  22
0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1

求数学期望
按照定义求, 先分离两个向量

 

[cpp]
as.vector(v) 是: 0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1  
as.integer(names(v)) 是:3  12  14  15  17  20  21  22  

as.vector(v) 是: 0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1
as.integer(names(v)) 是:3  12  14  15  17  20  21  22

求向量内积

 

[cpp]
> as.vector(v) %*% as.integer(names(v)) 
     [,1] 
[1,] 14.7 

> as.vector(v) %*% as.integer(names(v))
     [,1]
[1,] 14.7
貌似差别很大, 可能方差设置太大, 并且我很还对正态分布强行取整


如果我把样本个数调节到1000, 就与生成数据时设定的 20 很接近了


[cpp]
> A <- data.frame(a=round(rnorm(1000,20,9)), b=rpois(1000, lambda=10)) 
> mytable <-table(A[[1]],A[[2]]) 
> v = margin.table(mytable,1) /  margin.table(mytable) 
> as.vector(v) %*% as.integer(names(v)) 
      [,1] 
[1,] 19.88 

> A <- data.frame(a=round(rnorm(1000,20,9)), b=rpois(1000, lambda=10))
> mytable <-table(A[[1]],A[[2]])
> v = margin.table(mytable,1) /  margin.table(mytable)
> as.vector(v) %*% as.integer(names(v))
      [,1]
[1,] 19.88

 

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,