在r中计算加权转移矩阵

时间:2015-12-02 06:39:54

标签: r

我觉得这个问题很有意思: Transition matrix

因此,按照他的设置,假设我在每行添加一个权重(xt2):

<fetch mapping="logical" version="1.0">
  <entity name="UoM">
    <attribute name="UoMId" />
    <attribute name="BaseUoM" />
    <attribute name="UoMScheduleId" />
    <attribute name="Name" />
    <attribute name="Quantity" />
    <link-entity name="UoM" from="UoMScheduleId" to="UoMScheduleId" alias="t2" link-type="inner">
    <filter>
      <condition attribute="UoMId" operator="eq" value="57E59AB7-AC8F-E511-80F0-005056BE36DF" />
    </filter>
    </link-entity>
  </entity>
</fetch>

QueryExpression query = new QueryExpression("uom");
query.ColumnSet = new ColumnSet(new[] { "uomid", "baseuom", "uomscheduleid", "name", "quantity", });
query.LinkEntities.Add(new LinkEntity("uom", "uom", "uomscheduleid", "uomscheduleid", JoinOperator.Inner) { EntityAlias = "t2" });
query.Criteria.AddCondition("t2", "uomid", ConditionOperator.Equal, guidID);
EntityCollection result   = OrganizationService.RetrieveMultiple(query);

使用该帖子中的答案,我们得到了转换矩阵:

 >df = data.frame(cusip = paste("A", 1:10, sep = ""), xt = c(1,2,3,2,3,5,2,4,5,5), xt1 = c(1,4,2,1,1,4,2,2,2,2),xt2=c(1:10));df
   cusip xt xt1 xt2
1     A1  1   1   1
2     A2  2   4   2
3     A3  3   2   3
4     A4  2   1   4
5     A5  3   1   5
6     A6  5   4   6
7     A7  2   2   7
8     A8  4   2   8
9     A9  5   2   9
10   A10  5   2  10

但是,如果我想计算res <- with(df, table(xt, xt1)) xt1 xt 1 2 4 1 1 0 0 2 1 1 1 3 1 1 0 4 0 1 0 5 0 2 1 result <- res/rowSums(res) ;a xt1 xt 1 2 4 1 1.0000000 0.0000000 0.0000000 2 0.3333333 0.3333333 0.3333333 3 0.5000000 0.5000000 0.0000000 4 0.0000000 1.0000000 0.0000000 5 0.0000000 0.6666667 0.3333333 列加权的转换矩阵怎么办?也就是说,当我们生成xt2时,我们不仅仅计算状态变化的频率,而是使用实际数字(权重)。例如,res应为4,res[2,1]应为9 + 10 = 19。 因此,想要的新res[5,2]应如下所示:

res

然后,我们可以使用上面相同的代码计算 xt1 xt 1 2 4 1 1 0 0 2 4 7 2 3 5 3 0 4 0 8 0 5 0 19 6 。 我怎样才能实现result?谢谢。

P.S。,或者还有其他方法来“加权”过渡矩阵吗?

1 个答案:

答案 0 :(得分:2)

我们可以使用xtabs。使用公式方法,我们在~的rhs上指定交叉分类变量,并在lhs上指定计数向量。默认情况下,它会执行sum

xtabs(xt2~xt+xt1, df)
#    xt1
#xt   1  2  4
#  1  1  0  0
#  2  4  7  2
#  3  5  3  0
#  4  0  8  0
#  5  0 19  6

或者tapply,我们按&#39; xt&#39;,&#39; xt1&#39;并将FUN指定为sum。对于那些没有组合的元素,它会给出NA,如果需要可以替换为0.

with(df, tapply(xt2, list(xt, xt1), FUN=sum))

或者我们可以使用acast中的reshape2。我们从长期&#39;重塑。广泛的&#39;通过指定公式和value.var列。

library(reshape2)
acast(df, xt~xt1, value.var='xt2', sum)