想做一个二维变量数学期望实验, 查看若干资料终于找到方法
先看这篇文章熟悉一下R的函数
http://www.cyclismo.org/tutorial/R/tables.html
构造数据
通过下面的函数构造了,正态分布和泊松分布的两列数据
A <- data.frame(a=round(rnorm(10,20,9)), b=rpois(10, lambda=10))
> 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]]) 直接得到
> 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)
> 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
求数学期望
按照定义求, 先分离两个向量
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) %*% as.integer(names(v)) [,1] [1,] 14.7
貌似差别很大, 可能方差设置太大, 并且我很还对正态分布强行取整
如果我把样本个数调节到1000, 就与生成数据时设定的 20 很接近了
> 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