ns2一个问题:code omitted because of length

用nam运行很简单的tcl脚本,会出现以下问题:

[code omitted because of length]
: no event type or button # or keysym
    while executing
"bind Listbox {
%W yview scroll [expr {- (%D / 120) * 4}] units
}"
    invoked from within
"if {[tk windowingsystem] eq "classic" || [tk windowingsystem] eq "aqua"} {
bind Listbox {
%W yview scroll [expr {- (%D)}] units
}
bind Li..."

经过查证,ns-2.34及以上版本不会出现这种问题,而以下版本会出现问题。解决方法是打个patch,然后重装,patch内容如下:

--- tk8.4.18-orig/generic/tkBind.c 2006-07-21 08:26:54.000000000 +0200
+++ tk8.4.18/generic/tkBind.c 2008-07-05 12:17:10.000000000 +0200
@@ -586,6 +586,9 @@
/* ColormapNotify */       COLORMAP,
/* ClientMessage */       0,
/* MappingNotify */       0,
+#ifdef GenericEvent
+ /* GenericEvent */      0,
+#endif
/* VirtualEvent */        VIRTUAL, 
/* Activate */             ACTIVATE, 
/* Deactivate */           ACTIVATE,

本质上是在tk8.4.18/generic/tkBind.c的/* MappingNotify */ 和/* VirtualEvent */ 添加代码:

#ifdef GenericEvent
 /* GenericEvent */      0,
#endif
于是按照这种方法操作,并重启。

<think>我们正在处理一个关于Stata固定效应面板回归中变量被省略的问题(由于共线性)。用户可能在使用`xtreg, fe`命令时遇到了某些变量被标记为"omitted due to collinearity"的情况。我们需要解释原因并提供解决方案。 ### 原因分析 在固定效应面板回归中,变量被省略通常由以下原因引起: 1. **时间不变变量(Time-Invariant Variables)**: 固定效应模型通过组内变换(within transformation)消除个体固定效应。任何不随时间变化的变量(如性别、种族等)在组内变换后都会变成全零向量,因此无法被估计。Stata会将其自动剔除[^1]。 2. **多重共线性(Multicollinearity)**: 即使变量随时间变化,如果存在严格的线性关系(例如$A = B + C$),也会导致共线性问题。常见的场景包括: - 虚拟变量陷阱(完全多重共线性) - 变量之间存在精确的线性关系 - 样本量小或组内变异不足 3. **组内变异不足(Insufficient Within-Group Variation)**: 如果一个变量在个体内部的变化非常小(例如$90\%$的观测值不变),该变量在组内变换后接近常数,也会被剔除。 4. **固定效应与变量的线性关系**: 在固定效应模型中,个体固定效应已经包含了所有不随时间变化的特征。任何与个体固定效应线性相关的变量都会被排除。 ### 解决方案 #### 方法1:移除时间不变变量 手动检查并移除不随时间变化的变量: ```stata * 检查变量是否随时间变化 bysort id: egen mean_var = mean(var) gen diff_var = var - mean_var sum diff_var, detail // 若标准差为0,则是时间不变变量 ``` #### 方法2:使用虚拟变量控制固定效应 如果变量被错误识别为时间不变,但实际有微小变化,可尝试: ```stata * 使用更精细的固定效应 xtreg y x1 x2, fe ``` #### 方法3:处理多重共线性 - **检查变量间线性关系**: ```stata * 计算方差膨胀因子(VIF) reg y x1 x2 x3 estat vif // VIF>10表明存在共线性 ``` - **移除高度相关的变量**: ```stata pwcorr x1 x2 x3, sig // 检查相关系数 ``` #### 方法4:使用随机效应或混合模型 如果时间不变变量必须保留,考虑随机效应模型: ```stata xtreg y x1 x2, re // 随机效应 ``` #### 方法5:增加样本量或数据变换 - 扩大样本量以提高组内变异 - 对变量进行非线性变换(如取对数) ### 完整示例 ```stata * 载入数据 webuse nlswork, clear * 固定效应回归(部分变量被省略) xtreg ln_wage hours tenure, fe i(idcode) * 检查被省略变量(如tenure) * 解决方案:增加组内变化变量或移除时间不变变量 xtreg ln_wage hours, fe i(idcode) // 移除tenure * 或改用随机效应 xtreg ln_wage hours tenure, re i(idcode) ``` ### 关键验证点 1. **时间不变性诊断**: ```stata bysort id: egen const_check = sd(x) tab const_check // 若存在0值,则对应个体x无变化 ``` 2. **组内变换可视化**: ```stata xtset id year gen within_x = x - L1.x // 一阶差分(替代组内变换) scatter within_x year ``` ### 注意事项 - 固定效应模型无法估计时间不变变量的系数,这是模型设计使然,并非错误[^2]。 - 使用`areg`命令可更直观地看到被吸收的固定效应: ```stata areg y x1 x2, absorb(id) ``` §§相关问题§§ 1. 固定效应和随机效应的区别是什么? 2. 如何在Stata中检验固定效应模型是否合适? 3. 面板数据中多重共线性的诊断方法有哪些? 4. 如何解决固定效应模型中的异方差问题? [^1]: Wooldridge, J. M. (2010). *Econometric Analysis of Cross Section and Panel Data* (2nd ed.). MIT Press. [^2]: Cameron, A. C., & Trivedi, P. K. (2005). *Microeconometrics: Methods and Applications*. Cambridge University Press.</think>### Stata固定效应模型变量因共线性被省略的解决方案 在固定效应面板回归(`xtreg, fe`)中,变量因共线性被省略是常见问题,主要由以下原因引起: #### 原因分析 1. **时间不变变量(Time-Invariant Variables)** 固定效应模型通过组内变换消除个体效应,任何不随时间变化的变量(如性别、种族等)在变换后变为常数,导致无法估计: $$ \text{Within-transformation: } (x_{it} - \bar{x}_i) = 0 \quad \text{若} \ x_{it} = c_i $$ Stata会自动剔除这类变量[^1]。 2. **多重共线性问题** - 变量间存在精确线性关系(如$A = B + C$) - 虚拟变量陷阱(完全多重共线性) - 组内变异不足(如变量在个体内部变化极小) 3. **固定效应吸收** 个体固定效应已包含所有不随时间变化的特征,导致相关变量被排除: ```stata xtreg y x1, fe // x1被省略若其与个体固定效应完全相关 ``` #### 解决方案 ##### 方法1:识别并移除时间不变变量 ```stata * 检查变量时间变化性 bysort id: egen mean_var = mean(x1) gen diff_var = sd(x1) // 组内标准差 sum diff_var, detail // 若标准差=0则为时间不变变量 * 移除后重新回归 xtreg y x2 x3, fe i(id) ``` ##### 方法2:处理多重共线性 ```stata * 诊断共线性 reg y x1 x2 x3, vce(robust) estat vif // VIF>10表明严重共线性 * 解决方案: // 1. 移除高相关变量 xtreg y x1 x3, fe // 移除x2 // 2. 变量变换 gen ln_x1 = log(x1) xtreg y ln_x1 x2, fe // 3. 合并类别(虚拟变量过多时) recode region (1 2=1) (3 4=2), gen(region_cat) ``` ##### 方法3:使用其他模型 当必须保留时间不变变量时: ```stata * 随机效应模型 xtreg y x1 x2, re i(id) * 混合效应模型 reg y x1 x2 i.id, vce(cluster id) * 相关随机效应(CRE) xtset id gen mean_x1 = mean(x1) // 计算组内均值 xtreg y x1 mean_x1, re ``` ##### 方法4:增加数据变异 ```stata * 扩大样本量 keep if year > 2010 // 选择变异更大的时间段 * 分层抽样 set seed 123 sample 50, by(id) count // 每个个体抽取50%样本 ``` #### 完整示例 ```stata webuse nlswork, clear xtset idcode year * 错误:tenure被省略(与个体固定效应共线性) xtreg ln_wage hours tenure, fe * 解决方案1:移除tenure xtreg ln_wage hours, fe * 解决方案2:改用随机效应 xtreg ln_wage hours tenure, re * 解决方案3:添加时间趋势项 gen time_trend = year - 1970 xtreg ln_wage hours tenure time_trend, fe ``` #### 诊断工具 ```stata * 检查被省略变量 matrix list e(V) // 显示方差-协方差矩阵 * 组内变异可视化 xtline x1, overlay // 观察个体内变化 ``` > **关键提示**:固定效应模型无法估计纯时间不变变量是设计特性而非错误[^2]。若需估计此类变量,应选用随机效应或混合模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值