成分数据分组差异性分析comositional data analysis

##结果出现0,请教是哪一个出现问题,求大神们赐教
##我认为可能的原因:1、和数据相关,我的数据里面是有零的。
##由于数据无法进行修改,请问各位代码哪里出现问题导致结果为0呢?
##数据如下:

img

##代码如下:


comp_subgroup_mean <- function(data, group, coda_var, includeNA = FALSE){
  
  data.org <- data
  data <- data[complete.cases(data[,group]),]
  N <- ifelse(includeNA, nrow(data.org), nrow(data))
  lvl <- levels(data[, group])
  d <- length(lvl)
  tmp.l <- vector(mode = 'list', length = d)
  for (i in 1:d) {
    ind <- data[,group] == lvl[i]
    n <- sum(ind)
    perc <- round(n/N*100,1)
    n.perc <- paste(n, '(', perc, '\\%)')
    tmp.mean <- coda_mean(data[ind, coda_var])
    tmp.text <- paste((tmp.mean*24) %>% round(.,2), '(', (tmp.mean*100) %>% round(.,1),'\\%)')
    tmp.l[[i]] <- c(lvl[i],n.perc,tmp.text,' ')
  }
  
  ina <- as.numeric(data[, group])
  k <- max(ina)
  trans.data <- pivotCoord(data[,coda_var]) %>% as.matrix()
  
  if (k == 2) {
    tmp.test <- Compositional::james(trans.data[ina == 1,], trans.data[ina == 2,], R = 1)$info
  }
  
  if (k > 2) {
    tmp.test <- Compositional::maovjames(trans.data, ina)
  }
  
  tmp.tbl <- rbind(c(group,rep(' ', 5), ifelse(tmp.test['p-value'] < 0.001, '<0.001', round(tmp.test['p-value'],3))),
                   tmp.l %>% Reduce(rbind,.))
  
  if (includeNA) {
    n.na <- sum(is.na(data.org[,group]))
    tmp.tbl <- rbind(tmp.tbl, c('NA',paste(n.na,'(',round(n.na/N*100,1),'\\%)'),rep(' ',5)))
  }
  
  return(tmp.tbl)
}

##结果如下:

img

对零值特殊处理下,利用下Dirichlet分布,做完以后分组对样本量较小的组进行合并。

R语言实现常用的5种分析方法(主成分+因子+多维标度+判别+聚类
可以借鉴下
https://blog.csdn.net/hu397313168/article/details/129055392

成分数据分组差异性分析结果为0,要不就是数据的问题,要不就是程序处理逻辑的问题。如果你怀疑是数据的问题,数据里面有0,那么,你可以在进行处理之前,用程序对数据做一个数据预处理,将0值的数据删除或者使用平均值替换掉为0的值。还要一种可能就是程序处理的问题,在处理的过程中,可能数据为负数,正数和负数相加可能就为0了,或者说你那里的代码写错了。

对零值进行判断一下,进行处理一下

源于ChatGPT 仅供参考

这段代码看起来没有直接计算结果的部分,因此结果为0可能是在其他地方调用了`comp_subgroup_mean()`函数并使用了它的返回值,而在该函数中的某个部分出现了问题导致返回的结果为0。如果需要更具体的帮助,请提供调用该函数的代码以及输入数据的样例。

可能是由于以下原因之一:

1、数据预处理不正确,如果预处理不正确,可能会导致某些组之间的差异为0。
2、样本量不足,如果样本量过少,可能会导致某些组之间的差异不明显,从而出现0。
3、模型选择不正确,如果选择的模型不适合数据集,可能会导致某些组之间的差异为0。
建议:
1、检查数据预处理是否正确,检查数据中是否存在缺失值,并使用合适的方法进行处理。
2、尝试增加样本量或使用其他p值计算方法。
3、选择更适合的模型。或者检查模型的参数是否设置正确。尝试使用其他统计量来代替均值。

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

如果您在C# Framework中发布了一个ASMX接口,并且希望监听传入和传出的数据,有几种方案可供选择:

  1. 使用SOAP扩展插件:您可以使用第三方的SOAP扩展插件来拦截和监视传入和传出的SOAP消息。这些插件通常提供了事件或钩子,允许您捕获和处理接收到的请求以及发送的响应。您可以编写自定义代码来处理这些事件,并在其中记录或分析数据。
  2. 使用HTTP模块:您可以创建一个自定义的HTTP模块,它可以拦截和监视传入和传出的HTTP请求和响应。您可以在模块中订阅事件,如BeginRequest和EndRequest,以获取请求和响应的数据。然后,您可以根据需要记录或处理这些数据。
  3. 使用消息检查器(Message Inspector):如果您使用WCF(Windows Communication Foundation)来实现Web服务,您可以使用自定义消息检查器来拦截和监视传入和传出的消息。消息检查器是WCF的扩展点,允许您在消息传输过程中拦截和检查消息内容。您可以实现自己的消息检查器,并在其中记录或分析消息数据。

请注意,以上提到的方案都需要编写自定义代码来处理数据的监听和记录。具体实现的复杂程度取决于您的需求和系统的复杂性。如果您需要专业方案并愿意付费,建议咨询专业的软件开发公司或开发人员,他们可以根据您的具体需求提供定制化的解决方案。