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
补充:综合编程 , 其他综合 ,