Welch T检验/ ANOVA / Pearson卡方检验,样本量不等

iyfamqjs  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(495)

请参见“附录3”

我试图在R中进行ANOVA检验,以根据变量“年龄”(在我的代码中,P20_range代表不同的年龄区间),看看西班牙2019年大选中5个主要政党的选民是否存在差异。
我的代码如下:

CIS_data_5 <- data.frame(
  CIS$RECUERDO,
  CIS$P20
)

CIS_data_5$CIS.RECUERDO <- sub("\\(NO LEER\\) ", "", CIS_data_5$CIS.RECUERDO)
RecuerdoDeVoto1 <- subset(CIS_data_5, CIS.RECUERDO %in% c("Unidas Podemos"))
RecuerdoDeVoto2 <- subset(CIS_data_5, CIS.RECUERDO %in% c("PSOE"))
RecuerdoDeVoto3 <- subset(CIS_data_5, CIS.RECUERDO %in% c("Ciudadanos"))
RecuerdoDeVoto4 <- subset(CIS_data_5, CIS.RECUERDO %in% c("PP"))
RecuerdoDeVoto5 <- subset(CIS_data_5, CIS.RECUERDO %in% c("VOX"))

P20 <- as.integer(as.character(CIS_data_5$CIS.P20))

P20labs <- c("16-29", "30-44", "45-64", ">65", "N.C.")
cut_points <- c(16, 30, 45, 65, Inf)

i <- findInterval(P20, cut_points)
P20_fac <- P20labs[i]
P20_fac[is.na(P20)] <- P20labs[length(P20labs)]
P20_fac <- factor(P20_fac, levels = P20labs)

CIS_data_5$CIS.P20 <- P20
CIS_data_5$P20_range <- P20_fac

P20_range <-as.vector(CIS_data_5$P20_range)

# Computing the Analysis of Variance
CIS_data_6 <- list(RecuerdoDeVoto1=RecuerdoDeVoto1,RecuerdoDeVoto2=RecuerdoDeVoto2,RecuerdoDeVoto3=RecuerdoDeVoto3, RecuerdoDeVoto4=RecuerdoDeVoto4,RecuerdoDeVoto5=RecuerdoDeVoto5)
 data.frame(RecuerdoDeVoto=unlist(CIS_data_6),
            P20_range=factor(rep(names(CIS_data_6),sapply(CIS_data_6,length))))
 
res.aov <- aov(RecuerdoDeVoto~P20_range, data = CIS_data_6)

# Summary of the Analysis
summary(res.aov)

然而,我不确定我做错了什么,因为我查了这个问题Attempting to create anova table with unequal sizes R,我已经完全复制了代码(当然,有必要的修改,所以它适合我的数据),但我不断得到以下错误:

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 191, 623, 115, 387, 114

这当然对应于西班牙5个主要政党(Unidas Podemos,PSOE,Ciudadanos,PP和VOX)中每个政党的不同选民数量。
我不确定如何在我的代码中覆盖这个问题。
因此,任何帮助都将不胜感激!
提前感谢!

增编一

有人建议我,也许我应该尝试执行皮尔逊卡方检验这个特定的问题,我试图分析;但我真的不知道在这种情况下我应该支持方差分析还是皮尔森卡方检验。同样,欢迎对此发表任何评论!

增编二

我尝试通过运行以下代码执行Pearson卡方检验:

CIS_data_5 <- data.frame(
  CIS$RECUERDO,
  CIS$P20
)

CIS_data_5$CIS.RECUERDO <- sub("\\(NO LEER\\) ", "", CIS_data_5$CIS.RECUERDO)
RecuerdoDeVoto1 <- subset(CIS_data_5, CIS.RECUERDO %in% c("Unidas Podemos"))
RecuerdoDeVoto2 <- subset(CIS_data_5, CIS.RECUERDO %in% c("PSOE"))
RecuerdoDeVoto3 <- subset(CIS_data_5, CIS.RECUERDO %in% c("Ciudadanos"))
RecuerdoDeVoto4 <- subset(CIS_data_5, CIS.RECUERDO %in% c("PP"))
RecuerdoDeVoto5 <- subset(CIS_data_5, CIS.RECUERDO %in% c("VOX"))

P20 <- as.integer(as.character(CIS_data_5$CIS.P20))

P20labs <- c("16-29", "30-44", "45-64", ">65", "N.C.")
cut_points <- c(16, 30, 45, 65, Inf)

i <- findInterval(P20, cut_points)
P20_fac <- P20labs[i]
P20_fac[is.na(P20)] <- P20labs[length(P20labs)]
P20_fac <- factor(P20_fac, levels = P20labs)

CIS_data_5$CIS.P20 <- P20
CIS_data_5$P20_range <- P20_fac

P20_range <-as.vector(CIS_data_5$P20_range)

RecuerdoDeVoto <- c(RecuerdoDeVoto1, RecuerdoDeVoto2, RecuerdoDeVoto3, RecuerdoDeVoto4, RecuerdoDeVoto5)
IntervalosDeEdad <- rep(P20_range, length(RecuerdoDeVoto1), length(RecuerdoDeVoto2), length(RecuerdoDeVoto3), length(RecuerdoDeVoto4), length(RecuerdoDeVoto5))
chisq.test(RecuerdoDeVoto, IntervalosDeEdad)

我得到了以下错误:

Error in chisq.test(RecuerdoDeVoto, IntervalosDeEdad) : 
  'x' and 'y' must have the same length

增编三

经过大量的研究,我发现最好的方法是进行韦尔奇的T检验,因为我处理的是两个不同大小的样本,因此方差也不同。但是,我不知道如何在R中进行T检验。
任何帮助都是非常欢迎的!

dtcbnfnu

dtcbnfnu1#

我用下面的代码解决了这个问题:

CIS_data_5 <- data.frame(
  CIS$RECUERDO,
  CIS$P20
)

CIS_data_5$CIS.RECUERDO <- sub("\\(NO LEER\\) ", "", CIS_data_5$CIS.RECUERDO)
RecuerdoDeVoto1 <- subset(CIS_data_5, CIS.RECUERDO %in% c("Unidas Podemos"))
RecuerdoDeVoto2 <- subset(CIS_data_5, CIS.RECUERDO %in% c("PSOE"))
RecuerdoDeVoto3 <- subset(CIS_data_5, CIS.RECUERDO %in% c("Ciudadanos"))
RecuerdoDeVoto4 <- subset(CIS_data_5, CIS.RECUERDO %in% c("PP"))
RecuerdoDeVoto5 <- subset(CIS_data_5, CIS.RECUERDO %in% c("VOX"))

P20 <- as.integer(as.character(CIS_data_5$CIS.P20))

P20labs <- c("16-29", "30-44", "45-64", ">65", "N.C.")
cut_points <- c(16, 30, 45, 65, Inf)

i <- findInterval(P20, cut_points)
P20_fac <- P20labs[i]
P20_fac[is.na(P20)] <- P20labs[length(P20labs)]
P20_fac <- factor(P20_fac, levels = P20labs)

CIS_data_5$CIS.P20 <- P20
CIS_data_5$P20_range <- P20_fac

IntervalosDeEdad <-as.numeric(CIS_data_5$P20_range)

RecuerdoDeVoto <- as.numeric(c(RecuerdoDeVoto1$CIS.P20, RecuerdoDeVoto2$CIS.P20, RecuerdoDeVoto3$CIS.P20, RecuerdoDeVoto4$CIS.P20, RecuerdoDeVoto5$CIS.P20))

t.test(RecuerdoDeVoto, IntervalosDeEdad, var.equal = FALSE)

得到的P值〈2.2e-16 ;结论不言自明。

v7pvogib

v7pvogib2#

要对方差不等的样本执行ANOVA,需要对自由度进行校正,从而对F统计量进行校正。具有此校正的检验称为Welch ANOVA。
对于你的问题,样本大小相等不是经典方差分析中三个或更多样本的假设,所以你可以但不必应用韦尔奇修正,除非不满足方差相等的假设。
也就是说,如果样本量不相等,则通常将Welch校正应用于两个样本的t检验。
https://www.statisticshowto.com/welchs-anova/
对于方差不等的三个或更多样本,使用单向检验()进行Welch方差分析:

oneway.test(RecuerdoDeVoto~P20_range, data = CIS_data_6)

对于方差不等或大小不等的两个样本,使用t.test(),将变量等于布尔值设置为“FALSE”,以在R中进行Welch t检验:

t.test(RecuerdoDeVoto~P20_range, data = CIS_data_6, var.equal = F)

相关问题