R中两两误差估计产生的错误乘积

R中两两误差估计产生的错误乘积,r,loops,dataframe,pairwise,R,Loops,Dataframe,Pairwise,我想从熔化的矩阵中产生一个成对的错误,如下所示: pw.data = data.frame(true_tree = rep(c("maple","oak","pine"),3), guess_tree = c(rep("maple",3),rep("oak",3),rep("pine",3)), value = c(12,0,1,1,15,0,2,1,14)) true_tree guess_tree value ma

我想从熔化的矩阵中产生一个成对的错误,如下所示:

pw.data = data.frame(true_tree = rep(c("maple","oak","pine"),3), 
                 guess_tree = c(rep("maple",3),rep("oak",3),rep("pine",3)),
                 value = c(12,0,1,1,15,0,2,1,14))


true_tree guess_tree value
  maple      maple    12
    oak      maple     0
   pine      maple     1
  maple        oak     1
    oak        oak    15
   pine        oak     0
  maple       pine     2
    oak       pine     1
   pine       pine    14
所以我想估计真实树种和猜测树种之间的成对误差。对于该估计,公式应为“两两错误分配/所选两个物种的所有估计数”

更好的解释是:枫树和橡树的错误猜测(枫树和橡树的枫树比较)=1+0/所有猜测次数=12+1+2(真树的所有计数==“枫树)+0+15+1(真树的所有计数==”橡树)。因此,估计乘积为1/31

当我检查一个具体案例时,比如说枫树和橡树,我可以手动估算如下:

sum(pw.data[((pw.data[,1] == "maple" & pw.data[,2] == "oak") | 
      (pw.data[,1] == "oak" & pw.data[,2] == "maple")) &
      (pw.data[,1] != pw.data[,2]),3]) / 
 (sum(pw.data[pw.data[,1] == "maple",3]) + sum(pw.data[pw.data[,1] == "oak",3]))
但是,我希望对较大的数据进行此估计,因此,我希望创建一个for循环/函数来进行估计,并将结果存储在数据帧中,例如:

Pw_tree   value
Maple-oak 0.0123
....
我曾尝试在下面这样的for循环中使用该逻辑,但它根本不起作用

for (i in pw.data[,1]) { 
for (j in pw.data[,2]) {
x = sum( pw.data[((pw.data[,1] == i & pw.data[,2] == j ) | 
                (pw.data[,1] == j & pw.data[,2] == i)) &
               (pw.data[,1] != pw.data[,2]),3])  
y = (sum(pw.data[pw.data[,1] == i,3]) + sum(pw.data[pw.data[,1] == j,3]))
   PWerr_data = data.frame( pw_tree = paste(i,j, sep = "-"), value = x/y)
 }

}
如果我能看出我做错了什么,那就太好了。
非常感谢!

我通常通过构建我想要应用的函数来解决这些类型的问题(您几乎已经完成了),然后构建最方便应用的数据结构,然后我可以使用
apply
函数族中的一个函数在我的数据结构中迭代以获得结果。这让我避免了
for
循环结构,这是很好的,因为我是一种程序员,总是会在循环中搞乱索引双循环

在您的例子中,我们可以将求和比率包装到一个函数中,该函数以data.frame和两个树名作为参数。然后,我们只需要创建要使用的对集。一个方便的函数是
combn()
它允许您从
x
元素中获取所有大小组合
m
:这将为我们提供所需的非冗余对集

注释示例代码如下:

#加载数据
pw.data=data.frame(真树=rep(c(“枫树”、“橡树”、“松树”),3),
猜一猜树=c(代表“枫树”,3),代表“橡树”,3),代表“松树”,3),
值=c(12,0,1,1,15,0,2,1,14))
数据
#>真树猜测树值
#>1枫树枫树12
#>2橡树枫树0
#>3松枫1
#>4枫橡树1
#>5橡木15
#>6松栎0
#>7枫松2
#>8橡树1
#>9松树14
#构建我们将重复应用的函数
getErr[1]“枫树橡树”
#> 
#>$error\u率
#> [1] 0.03225806
#好,这与您提供的输出匹配
#构建我们将在其上运行函数的数据结构
所有树木[2,]枫树0.1
#>[3,]“橡树”0.03225806

由(v0.2.1)于2018年10月30日创建。

嘿,非常感谢。它对于大型数据集非常有用,非常感谢您以更好的方式简化了它!