DirichletReg包DR_data赋值报错求助:维度不匹配问题
Dirichlet回归数据转换报错解决
数据背景
- 个体总数:12
- 天数总数:6
- 模型总数:4
- 行为总数:9
数据框df的前几行如下(ID_Day为个体与天数的组合):
ID_Day Model PropActive PropEating PropGroom PropLit PropOther PropRest PropScrat PropSit PropStand Cho_1 C.RF5 0.01685185 0.02296296 7.053241e-02 1.157407e-05 0.009745370 0.5154745 0.001944444 0.3519097 0.010567130 Cho_1 C.SOM5 0.00000000 0.02565972 8.262731e-02 0.000000e+00 0.008217593 0.5735301 0.000000000 0.3000926 0.009872685 Cho_1 H.RF5 0.02368056 0.01856481 5.685185e-02 6.712963e-04 0.027395833 0.3424769 0.001446759 0.5040046 0.024907407 Cho_1 H.SOM5 0.04878472 0.02337963 1.157407e-05 0.000000e+00 0.048784722 0.3364352 0.000000000 0.5208681 0.021736111 Cho_2 C.RF5 0.01115741 0.02149306 5.105324e-02 6.944444e-05 0.008460648 0.6110648 0.001064815 0.2876852 0.007951389 Cho_2 C.SOM5 0.00000000 0.19230324 9.521991e-02 0.000000e+00 0.006284722 0.5040625 0.000000000 0.1916204 0.010509259
需求
使用DirichletReg包进行Dirichlet回归,比较不同模型间的预测行为比例,需先用DR_data()函数转换响应变量格式。
报错情况
执行以下代码时:
df$Y <- DR_data(df[, c("PropActive", "PropEating", "PropGroom", "PropLit", "PropOther","PropRest", "PropScrat", "PropSit", "PropStand")], base=1)
出现错误:
Error in set(x, j = name, value = value) : Supplied 2592 items to be assigned to 288 items of column 'Y'. If you wish to 'recycle' the RHS please use rep() to make this intent clear to readers of your code.
即使仅选择单个行为变量:
df$Y <- DR_data(df[, c("PropActive")], base=1)
仍报错:
Error in set(x, j = name, value = value) : Supplied 576 items to be assigned to 288 items of column 'Y'. If you wish to 'recycle' the RHS please use rep() to make this intent clear to readers of your code
解决方案
报错核心原因是DR_data()返回矩阵格式对象,直接赋值给数据框列时,数据框会将矩阵拆解为单个元素,导致元素数量不匹配(288行×9列=2592个元素,远大于数据框的288行)。
方法1:不存入原数据框,直接用于建模
# 提取所有行为比例列转为矩阵 y_mat <- as.matrix(df[, grep("^Prop", colnames(df))]) # 转换为Dirichlet回归所需格式 y_dr <- DR_data(y_mat, base=1) # 构建回归模型(以Model为自变量示例) model <- DirichletReg(y_dr ~ Model, data=df)
方法2:存入数据框的列表列(避免矩阵被拆解)
# 提取行为比例列转为矩阵 y_mat <- as.matrix(df[, grep("^Prop", colnames(df))]) # 用I()函数保留矩阵结构,存入数据框列 df$Y <- I(DR_data(y_mat, base=1))
前置检查
Dirichlet回归要求每行的行为比例之和为1,先验证数据是否满足:
rowSums(df[, grep("^Prop", colnames(df))])
若存在行和不为1的情况,需先做归一化处理,否则模型会报错。
内容的提问来源于stack exchange,提问作者Michelle Smit
相关产品推荐
相关产品推荐

