NA(P)T

  NAT就是Network Address Translation,过去好长时间我直觉得很好奇,在家里用路由器上网时,我没有全球唯一的IP,外网上的服务器是怎么样通过一层层的设备找到我的。另外,我也想知道是不是有办法能找到世界上任何一台计算机,不论它是在多深的NAT设备后面。

  今天终于知道了原理,虽然细节还不清楚,但在我心里,这件事至少是有道理的了,是可以想得通的了。

  在网上也搜了很多文章来看,但真的不知道写或者翻译那些文章的人是不是真的懂,至少在网上能找到的很多中文文档,都只是在说一些概念,完全不讲到实质,不能解惑。最后还是看IETF的RFC原文才弄明白的。

  专门讲NAT的RFC大概有4份:1631, 2663, 3022, 3715。其中最终解开我疑惑的是rfc3022,它解释了两种NAT方式的原理和区别。

  大多数情况下,NAPT(Network Address Port Translation)方式用得比较多,我们在家里用路由器上网时用的都是这种方式,内网的package到达NAT时,NAT记录下源地址和端口号,并重新分一个端口号给这个package,用这个新的端口号和NAT对外的地址换掉原来的源地址,再继续发送;当有回复到达NAT这个端口时,NAT再把之前记录下来的源地址和端口号换上,做为目标地址和端口,再发向内网主机,这样,内网主机就收到了回得的包。

  所以,总的来说,当由内网主机最初发出的包最终到达目标主机时,源端口号是被修改过的,不是最初的那个。但似乎这样并不影响通信。

<think>我们之前已经讨论过有序逻辑回归(如使用R的polr函数)中t值转化为p值的方法。现在,我将提供一个更通用、更详细的解决方案,并解释每一步。 核心步骤: 1. 拟合有序逻辑回归模型(使用MASS::polr) 2. 从模型摘要中提取系数表(包含估计值、标准误和t值) 3. 计算p值: - 对于回归系数(斜率参数),通常使用正态分布(因为大样本性质)计算p值。 - 对于阈值参数(cutpoints),也可以使用正态分布,但有时使用t分布(自由度=残差自由度)更合适,尤其是在样本量较小时。 4. 注意:在R的polr函数中,默认情况下,摘要输出的t值对于回归系数是使用正态分布假设计算的,但实际中我们可能需要根据样本大小选择分布。 然而,polr的summary函数默认只提供t值,不提供p值。因此,我们需要自己计算p值。 我们将提供两种方法: 方法1:所有参数都使用正态分布(大样本情况) 方法2:区分回归系数(正态分布)和阈值参数(t分布,自由度为残差自由度)——更严谨 残差自由度的计算:样本量减去模型中参数的总个数(包括所有回归系数和阈值参数)。 下面我们以R语言为例,展示如何实现。</think>### 有序逻辑回归中 t 值到 p 值的转换方法 在有序逻辑回归(有序 Logit 模型)中,t 值到 p 值的转换需要特殊处理,因为模型包含两类参数:自变量系数和阈值参数。以下是完整的解决方案: #### 核心实现代码 ```r # 安装必要的包 install.packages(c("MASS", "broom")) library(MASS) # 提供 polr 函数 library(broom) # 提供 tidy 函数 # 示例:使用 R 内置数据集 data(housing) housing$Sat <- ordered(housing$Sat, levels = c("Low", "Medium", "High")) # 拟合有序逻辑回归模型 model <- polr(Sat ~ Infl + Type + Cont, data = housing, Hess = TRUE, # 必需:计算Hessian矩阵 method = "logistic") # 提取系数和标准误 coef_table <- coef(summary(model)) # 方法1:正态分布近似(大样本) # 所有参数使用正态分布计算p值 p_values_norm <- 2 * pnorm(-abs(coef_table[, "t value"])) # 方法2:区分参数类型(推荐) # 计算残差自由度 n_obs <- nrow(model$model) # 样本量 n_params <- length(model$coefficients) + length(model$zeta) # 参数总数 df_residual <- n_obs - n_params # 残差自由度 # 区分自变量系数和阈值参数 is_threshold <- grepl("\\|", rownames(coef_table)) # 阈值参数名称包含"|" p_values_mixed <- ifelse( is_threshold, 2 * pt(-abs(coef_table[, "t value"]), df = df_residual), # 阈值参数用t分布 2 * pnorm(-abs(coef_table[, "t value"])) # 自变量系数用正态分布 ) # 创建结果表 result_table <- data.frame( Parameter = rownames(coef_table), Estimate = coef_table[, "Value"], Std.Error = coef_table[, "Std. Error"], t_value = coef_table[, "t value"], p_value_norm = p_values_norm, p_value_mixed = p_values_mixed ) # 打印结果 print(result_table) # 使用broom包简化输出 tidy_result <- tidy(model, conf.int = TRUE, exponentiate = FALSE) tidy_result$p.value <- 2 * pnorm(-abs(tidy_result$statistic)) print(tidy_result) ``` ### 代码详细解释 #### 1. 参数类型区分 有序逻辑回归有两类参数: - **自变量系数**:解释变量对有序结果的影响 ```r # 自变量系数使用正态分布计算p值 2 * pnorm(-abs(t_value)) ``` - **阈值参数**(截断点):定义类别之间的边界 ```r # 阈值参数使用t分布计算p值 2 * pt(-abs(t_value), df = df_residual) ``` #### 2. 残差自由度计算 自由度的计算对阈值参数的p值至关重要: ```r df_residual = n_obs - (n_coefficients + n_thresholds) ``` - `n_obs`:样本量 - `n_coefficients`:自变量个数 - `n_thresholds`:因变量类别数减1(如3个类别有2个阈值) #### 3. 分布选择依据 | 参数类型 | 推荐分布 | 理论依据 | |----------------|-----------|------------------------------| | 自变量系数 | 正态分布 | 大样本性质(中心极限定理) | | 阈值参数 | t分布 | 基于模型估计的有限样本性质 | | 小样本情况 | t分布 | 样本量 < 100时所有参数使用 | #### 4. broom包简化处理 `broom::tidy()`函数提供更简洁的输出: ```r tidy(model, conf.int = TRUE) %>% mutate(p.value = 2 * pnorm(-abs(statistic))) ``` ### 完整函数实现 ```r get_olr_pvalues <- function(model) { # 提取系数表 coef_table <- coef(summary(model)) # 计算样本量和参数数量 n_obs <- nrow(model$model) n_coefs <- length(model$coefficients) n_thresholds <- length(model$zeta) df_residual <- n_obs - (n_coefs + n_thresholds) # 识别阈值参数(包含"|"符号) is_threshold <- grepl("\\|", rownames(coef_table)) # 计算p值 p_values <- ifelse( is_threshold, 2 * pt(-abs(coef_table[, "t value"]), df = df_residual), 2 * pnorm(-abs(coef_table[, "t value"])) ) # 创建结果数据框 result <- data.frame( Parameter = rownames(coef_table), Estimate = coef_table[, "Value"], Std.Error = coef_table[, "Std. Error"], t_value = coef_table[, "t value"], p_value = p_values, df = ifelse(is_threshold, df_residual, NA) ) # 添加显著性标记 result$Significance <- cut(result$p_value, breaks = c(0, 0.001, 0.01, 0.05, 0.1, 1), labels = c("***", "**", "*", ".", ""), include.lowest = TRUE) return(result) } # 使用函数 result <- get_olr_pvalues(model) print(result) ``` ### 统计原理说明 1. **t 值的计算**: $t = \frac{\hat{\beta}}{SE(\hat{\beta})}$ 2. **p 值的计算**: - 正态分布:$p = 2 \times (1 - \Phi(|t|))$ - t 分布:$p = 2 \times (1 - F_{df}(|t|))$ 3. **分布选择的理论依据**: - 自变量系数:在大样本下服从正态分布(Wald 检验) - 阈值参数:有限样本下服从 t 分布(基于 Hessian 矩阵的估计) ### 注意事项 1. **比例优势假设**:确保模型满足平行线假设 ```r # 使用Brant检验验证 install.packages("brant") brant::brantTest(model) ``` 2. **小样本校正**:当样本量 < 100 时,所有参数使用 t 分布 ```r if(n_obs < 100) { p_values <- 2 * pt(-abs(coef_table[, "t value"]), df = df_residual) } ``` 3. **置信区间计算**: ```r confint(model) # 基于正态分布的置信区间 confint(model, method = "profile") # 更精确的轮廓似然法 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值