如何解释除 t 检验例如回归以外的统计检验中的配对观察?

如何解决如何解释除 t 检验例如回归以外的统计检验中的配对观察?

如何解释除 t-test 之外的统计检验中的成对观察?下面我将讨论两个示例,其中我尝试使用混合效果方法进行操作但失败了。

示例 1:如何在 t.test(...,paired=T) 中重现 lm()

# simulate data
set.seed(66)
x1 <- rnorm(n=100,mean=30,sd=6)
x2 <- rnorm(n=100,mean=60,sd=6)

# arrange the data in a dataset
dd <- data.frame(ID=rep(paste("ID",seq(1,100,by=1),sep="_"),2),response=c(x1,x2),group=c(rep("A",100),rep("B",100))
                        )
t.test(x1,x2,paired=F)
summary(lm(response~group,data=dd)) # same outcome

如果观察是成对的,可以用 t.test() 解释它,但如何在 lm() 中做到这一点(如果可能的话)?我尝试使用混合效应模型方法,但是:

summary(lmerTest::lmer(response~group + (1+group|ID),data=dd))

给出错误:

Error: number of observations (=200) <= number of random effects (=200) for term (1 + group | ID);
the random-effects parameters and the residual variance (or scale parameter) are probably unidentifiable

虽然:

summary(lmerTest::lmer(response~group + (1|ID),data=dd))

运行但固定效应参数估计和相关的标准。误差和 t 值与 lm() 产生的相同。

示例 2:具有成对观测值的线性回归

假设我创建的数据集中的观察结果来自相隔 30 天测量的对象 - 即,100 个对象中的每一个在第 0 天测量,然后在第 30 天再次测量 - 我们想要估计变化率时间:

dd$time=c(rep(0,rep(30,100)) # add "time" variable to dd

数据如下所示(黑色为线性回归,由红线链接成对数据):

enter image description here

lm1 <- lm(response~time,data=dd)

lm1 不考虑观察的成对性质。 我想运行一个混合效应模型,允许每对数据的截距和斜率不同,但 R 再次抗议我试图估计太多参数:

lmerTest::lmer(response ~ time + (time | ID),data=dd)
# Error: number of observations (=200) <= number of random effects (=200) for term (time | ID);
# the random-effects parameters and the residual variance (or scale parameter) are probably unidentifiable

允许数据对截距不同但斜率不同的更简单模型,即:

lmer(response ~ time + (1 | ID),data=dd)

投诉:

boundary (singular) fit: see ?isSingular

但运行并产生与 lm() 产生的相同的固定效应估计。

[更新]

@Limey 提醒我,配对 t 检验只不过是评估两组之间的配对差异是否为零的 t 检验。这种成对差异可用于执行除 t 检验之外的任何配对统计检验。为了验证这一点,我创建了三个不同的“响应”变量,它们组合了以不同方式排序的 x1x2(分别为:原始随机顺序;x1 递增和 {{1} } 降序;两者都是升序)。

x2

enter image description here

我计算了相应的差异:

dd$response2 <- c(sort(x1,decreasing = FALSE),sort(x2,decreasing = T))
dd$response3 <- c(sort(x1,decreasing = F))

enter image description here

并用它们来执行线性模型:

dd$diff1 <- c((dd$response[1:100]-dd$response[1:100]),(dd$response[101:200]-dd$response[1:100]))
dd$diff2 <- c((dd$response2[1:100]-dd$response2[1:100]),(dd$response2[101:200]-dd$response2[1:100]))
dd$diff3 <- c((dd$response3[1:100]-dd$response3[1:100]),(dd$response3[101:200]-dd$response3[1:100]))

我预计它们的斜率估计会有所不同,但它们都相同:

lm2.diff1 <- lm(diff1~time,data=dd)
lm2.diff2 <- lm(diff2 ~time,data=dd)
lm2.diff3 <- lm(diff3 ~time,data=dd)

它们的斜率估计值与对应的“未配对”线性模型(summary(lm2.diff1)$coeff[2] # 0.9993754 summary(lm2.diff2)$coeff[2] # 0.9993754 summary(lm2.diff3)$coeff[2] # 0.9993754 lm(response~time)lm(response2~time))的估计值相同。我错过了什么?

解决方法

配对 t 检验只是测试平均值(两组之间的差异)是否为零。因此,要通过其他方式“模拟”配对 t 检验的结果,只需预先计算差异并将其传递给您选择的测试。使用您的示例:

x1 <- rnorm(n=100,mean=30,sd=6)
x2 <- rnorm(n=100,mean=60,sd=6)
diff <- x1-x2
dd <- data.frame(response=diff)
# Standard paired t-test
t.test(x1,x2,paired=T)


    Paired t-test

data:  x1 and x2
t = -36.167,df = 99,p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -31.93760 -28.61546
sample estimates:
mean of the differences 
              -30.27653 

现在是“模拟”t 检验...

t.test(diff)

    One Sample t-test

data:  diff
t = -36.167,p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -31.93760 -28.61546
sample estimates:
mean of x 
-30.27653 

现在作为线性模型

summary(lm(response~1,data=dd)) 


Call:
lm(formula = response ~ 1,data = dd)

Residuals:
    Min      1Q  Median      3Q     Max 
-18.473  -7.328   0.614   6.101  20.764 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -30.2765     0.8371  -36.17   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.371 on 99 degrees of freedom
,

好问题!这里有一些棘手的地方。

  1. 我们可以从通过 t.test() 和手动计算配对测试开始:
pairedtest1 <- t.test(x1,paired=TRUE)
d <- x1-x2
n <- length(x1)
tstat <- mean(d)/(sd(d)/sqrt(n))                    ## -37.58846
pval <- 2*pt(abs(tstat),lower.tail=FALSE,df=n-1)  ## 2.065802e-60
all.equal(pairedtest1$p.value,pval) ## TRUE
all.equal(unname(pairedtest1$statistic),tstat) ## TRUE
  1. 正如您所发现的,当每组每个治疗只有一个观察值时,当在线性混合模型中使用时,具有随机截距治疗组间变异的模型过度拟合;给出了一个类似的例子 here。如果需要,您可以强制 lmer 适应它:
m0 <- lme4::lmer(response~group+(group|ID),data=dd,REML=TRUE,control=lmerControl(check.nobs.vs.nRE="ignore",calc.deriv=FALSE))

(请注意,我们还可以通过比较对数似然或 REML 标准来查看两个模型是否给出了等效拟合 - 当我们对这样的模型进行过拟合时,不同模型可以通过模型参数的不同线性组合获得等效拟合。 ..)

如果我们跑

library(lmerTest)
coef(summary(as(m1,"lmerModLmerTest"),ddf="Kenward-Roger"))["groupB",]

(这里默认的 Satterthwaite ddf 计算失败)我们得到

    Estimate   Std. Error           df      t value     Pr(>|t|) 
2.998126e+01 7.976192e-01 9.900000e+01 3.758844e+01 2.065922e-60 

t 统计量和 p 值与上面的结果非常匹配(我本来可以说 summary(),但想取出系数表的这一特定行)。

  1. 现在让我们尝试简化模型
m1 <- lme4::lmer(response~group+(1|ID),REML=TRUE)

正如您所指出的,拟合是奇异的(如果您选中,则 RE 方差将列为 0)。这里的 t 统计量和 p 值有点偏离(此时,我不太确定为什么以前的模型有效!)。原因是,对于这个数据集,组内方差比组间方差略。一般来说,我们期望 var(between) = sigma^2_between + sigma_2_within/n,这在渐近/期望中起作用,但在小数据集中,排序可能与我们在这里观察到的方向一致,在这种情况下,我们需要一个方差以完美拟合数据。

resids <- with(dd,response-ave(response,group,FUN=mean))
wv <- var(resids-ave(resids,dd$ID,FUN=mean))    ## 15.82
bv <- var(tapply(resids,list(dd$ID),FUN=mean))  ## 14.92

(如果我们用 lme 拟合相同的模型,它出现可以,并为我们提供一个小的 [但非零] 组间截距方差估计,但如果我们尝试intervals(m2) 它抱怨近似的 var-cov 矩阵不是正定的...)

  1. 正如 Gang Chen 在 2011 post to r-sig-mixed-models 中指出的那样,我们可以通过允许组内两个观察值之间存在相关性来拟合我们想要的模型(上面显示的加性模型只允许非负相关):
library(nlme)
m2 <- lme(response~group,random=list(ID=pdCompSymm(form=~group-1)),method="REML")
all.equal(tstat^2,anova(m2)[["F-value"]][2]) ## TRUE
all.equal(pval,anova(m2)[["p-value"]][2])    ## TRUE

来自 anova() 的 p 值与我们上面的结果相匹配,而 F 统计量与我们的 t 统计量的 square 相匹配。

  1. 我们也可以在 glmmTMB 中这样做:我们必须小心一点,因为 cs() 中的默认 glmmTMB 协方差结构允许每个术语有不同的方差,而 {{1 }} 施加同质方差:
corCompSymm

m3 <- glmmTMB::glmmTMB(response~group+cs(group-1|ID),REML=TRUE) m4 <- update(m3,map=list(theta=factor(c(1,1,2)))) 参数将随机效应参数向量的前两个元素设置为相同)

系数表使 t 统计量(它称为 az 值)正确,但没有“分母自由度”的概念,因此 Z 检验而不是 t 检验......

map
,

他们的斜率估计与相应的估计相同 “未配对”线性模型(lm(response~time)lm(response2~time)、 和lm(response3~time))。我错过了什么?

三个模型的总斜率相同是有道理的,即所有成对斜率的平均值(这很容易确认)。 我缺少的是,在 lm2.diff3 的情况下,斜率估计周围的 StdErr 大约比 lm2.diff1lm2.diff2 中的小一个数量级。 lm2.diff3Response3 上执行,与 Response1Response2 相比,每对观察的行为更加一致,因此其斜率估计周围的 StdErr 更小。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-